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 }