添加字符#使得目标串的长度为奇数,例如: abc 变成 #a#b#c#; 然后遍历改变后的串,定义左右指针来判断是否是回文串


import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        // 最长回文字串
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()){
            String bf = new String(sc.nextLine());// 最长回文字串匹配算法,Manacher 算法
            char[] bfChar = new char[bf.length() + 1 + bf.length()];// 保证是奇数
            int[] res = new int[bf.length() + 1 + bf.length()];
            for(int i = 0,j = 0; i < bf.length() * 2 + 1;i++){
                if(i % 2 ==  0) bfChar[i] = '#';
                else {
                    bfChar[i] = bf.charAt(j);j++;
                }
            }
            int maxSame = 0;// 保存当前计算的结果
            int left = 1;// 左右两个指针
            int right = 1;
            for(int i = 0;i < bf.length() * 2 + 1;i++) {
                // 先从第一个字符开始匹配,从左右走,如果遇到不相等的就结束
                left = i - 1;
                right = i + 1;
                maxSame = 0;
                while (true) {
                    if(left < 0 || right > bf.length() * 2) break;
                    if (i == 0 || i == bf.length() * 2) {res[i] = 0;break;}// 如果本来就是数组的边界,那么肯定回文串的长度就是0
                    else if (bfChar[left] != bfChar[right]) {// 如果左右两个字符都不相等的话,那么就是此时的结果就是
                        res[i] = maxSame;
                        break;
                    } else {
                        // 两个字符相等
                        left--;
                        right++;
                        maxSame++;
                        res[i] = maxSame;
                    }
                }
            }
            maxSame = -1;
            for(int i = 0;i < res.length;i++)
                if(res[i] > maxSame) maxSame = res[i];
            System.out.println(maxSame);

        }
    }
}