对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定Is PAT&TAP symmetric?
,最长对称子串为s PAT&TAP s
,于是你应该输出11。
输入格式:
输入在一行中给出长度不超过1000的非空字符串。
输出格式:
在一行中输出最长对称子串的长度。
输入样例:
Is PAT&TAP symmetric?
输出样例:
11
思路:本题可以有多种方法来解决,动态规划,马拉车等等,但是我更擅长动态规划来解决此题,本题定义一个动态规划数组dp[i][j],表示的意义为字符串从i-j是否为回文串,首先应该确定数组的边界,当字串长度为1时一定为会文串,当子串长度为2时只要判断s[i]是否等于s[j]就可以判断i-j是否为回文串,当字串的长度大于等于2时知道判定s[i]==s[j]和dp[i+1][j-1]>0就可判断是否为回文串,所以本题的状态公式为: 1 i==jdp[i][j]= 2 i-j==1&&str[i]==str[j] dp[j+1][i-1]+2 str[i]==str[j]&&dp[j+1][i-1]>0
代码:
/** * */ package com.xingbing.tianti; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Scanner; /** * @author 邢兵 * @data * @description */ public class L2008 { public static void main(String[] args) throws IOException { Scanner in = new Scanner(System.in); BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); String str = reader.readLine(); int dp[][] = new int[str.length()][str.length()]; int ans =0; for(int i=0;i<str.length();i++){ for(int j=0;j<=i;j++){ if(i==j){ dp[j][i] = 1; }else if(i-j==1){ if(str.charAt(i)==str.charAt(j)){ dp[j][i] = 2; } }else if(i-j>=2){ if(str.charAt(i)==str.charAt(j)&&dp[j+1][i-1]>0){ dp[j][i] = dp[j+1][i-1]+2; } } } } for(int i=0;i<dp.length;i++){ for(int j=0;j<dp[0].length;j++){ ans = Math.max(ans, dp[i][j]); } } System.out.println(ans); } }
原文地址:https://www.cnblogs.com/xuesujun/p/12232069.html
时间: 2024-10-12 08:24:00