对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定Is PAT&TAP symmetric?
,最长对称子串为s PAT&TAP s
,于是你应该输出11。
输入格式:
输入在一行中给出长度不超过1000的非空字符串。
输出格式:
在一行中输出最长对称子串的长度。
输入样例:
Is PAT&TAP symmetric?
输出样例:
11
NOTE:
这个题目与最长回文子串差不多,用动态规划,先初始化,考虑边界情况,最开始没判断之前初始边界为1。dp[i][j]表示第s[i]与是s[j]之间是否是回文字符串,如果是dp[i][j] = 1,不是就等于0;怎样判断s[i]与s[j]之间是回文字符串呢?只要s[i+1]与s[j-1]之间是回文字符串并且s[i]==s[j]。如果s[i]!=s[j],s[i]与s[j]之间是回文字符串
不过有两个测试点需要注意的,题目中说是非空字符串,所以输出的长度最小是1,不是0。
代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
int cnt = 1;//因为是非空字符串,所以初始为1,不会有为0的情况
int right = 0; int left = 0;
int len = s.length();
//题目中说的是非空字符串,不用考虑len = 0的情况
int[][] dp = new int[len+1][len+1];
for(int i = 0; i<len; i++){
dp[i][i] = 1;
if(i<len-1){
if(s.charAt(i) == s.charAt(i+1)){
dp[i][i+1] = 1;
cnt = 2;
right = i;left = i+1;
}
}
}
//状态转移方程
for(int L = 3; L<=len; L++){
for(int i = 0; i+L-1<len; i++){
int j = i+L-1;
if(dp[i+1][j-1] == 1 && s.charAt(i) == s.charAt(j)){
dp[i][j] = 1;//更新
right = i;left = j;
cnt = L;
}
}
}
System.out.println(cnt);
}
}