//求最大回文问题,最有名的要数manacher算法-----该算法采用的从对称轴点开始向左右扩散,为解决对称奇偶问题,向每个字符间插入没有没有出现过的字符(包括首尾)。
//参考博客:https://segmentfault.com/a/1190000003914228
//但我这里采用了,二维矩阵来进行计算。基本思路如下:(为以后自己回忆方便,立个flag)
public class Main{
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
while (scanner.hasNextLine()){
String str = scanner.next();
StringBuilder sb = new StringBuilder(str).reverse(); //对原字符串进行反转,根据回文特性,反转前后一致。非回文则不一致
System.out.println(core(str.toCharArray(),sb.toString().toCharArray()));
}
}
private static int core(char[] str,char[] sb){
int dp[][] = new int[str.length+1][str.length+1]; //创建一个二维矩阵,行对应原字符串,列对应反转后字符串
int max = 0; //记录二维矩阵连续对角线最大值。
for(int i = 1;i < str.length+1;i++){ //遍历二维矩阵行
for(int j = 1;j < str.length+1;j++){ //遍历二维矩阵列
if(str[i-1] == sb[j-1]){ //如果相等,将ij所处位置上的上一个对角线位置的值加一。核心思想--回文在二维数组中一定处在准对角线的位置上,有多少,累加多少次
dp[i][j] = dp[i-1][j-1] + 1;
}
if(dp[i][j] > max) //更新最大值
max = dp[i][j];
}
}
return max;
}
}