public int getLongestPalindrome(String s,int n) {
        StringBuilder sb = new StringBuilder();
        sb.append("$#"); //这里可以在前后添加字符防止后面越界,不加的话while中心扩展时需要判断越界
        for (int i = 0; i < s.length(); ++i) {
            sb.append(s.charAt(i));
            sb.append('#');
        }
        sb.append('&');
        char[] chars = sb.toString().toCharArray();

        int p[] = new int[chars.length]; //存储第i位的回文半径(不包含自己的一边长度)
        int C = 0; //中心
        int R = 0; //最右边界
        int C_max = 0;//最大回文中心
        int R_max = 0;//最大回文半径
        for (int i = 1; i < chars.length - 1; i++) {
            int i_mirror = 2 * C - i; //i关于C的对称点
            if (i<R) { //保证i还在最右边界内
                p[i] = Math.min(R - i, p[i_mirror]); //这里画图理解
                /*
                 *   -----RM----iM-----C-----i-------R------
                 *   RM~R是关于C对称的,里面的IM也和i对称,
                 *   如果iM的回文半径小于R-i, i的回文半径等于iM的回文
                 *   否则就是iM的回文半径取R-i,超出的无法判断。
                 * */
            }

            //其他情况,利用中心扩展
            while ( chars[i + 1 + p[i]] == chars[i - 1 - p[i]]) p[i]++;

            //更新回文半径
            if (i + p[i] > R) {
                C = i;
                R = i + p[i];
            }
            //更新最大回文
            if (R_max < p[i]){
                C_max = i;
                R_max = p[i];
            }
        }
        return R_max; //(C_max + R_max )/2 - (C_max - R_max )/2
    }