多方参考后写的一个java版本的,通过oj。
public String longestPalindrome(String s) {
// $#a#b#c#b#@ abcb notes: p[i] = right move + 1. So right doesn't count.
int len = s.length();
if(len < 2) return s;
char[] ss = new char[len * 2 + 3];
ss[0]= '$'; ss[len*2+2] = '@';
for(int i = 1; i < len * 2 + 2; i ++){
if(i %2 == 0){
ss[i] = s.charAt(i/2 - 1);
}
else
ss[i] = '#';
}
// System.out.println("Array is : " + Arrays.toString(ss));
int[] p = new int[ss.length];
int center = 0, right = 0;
for(int i = 1; i < ss.length - 1; i ++){
//
int mirror = 2 * center - i;
if(right > i) p[i] = Math.min(p[mirror], right - i);
while(ss[i-p[i]] == ss[i+p[i]]) p[i] ++;
if(i + p[i] > right){
center = i;
right = i + p[i];
}
}
//find answer
int max = 0;
for(int i = 1; i < p.length -1; i ++){
if(p[i] > max){
max = p[i];
center = i;
}
}
return s.substring((center - p[center])/2, (center + p[center])/2 -1);
}