翻译
- 1
- 2
- 3
- 1
- 2
- 3
原文
public class Solution {
public String longestPalindrome(String s) {
int max = 0;
int c = 0;
String ss = s;
s = preProcess(s);
int len = s.length();
int p[] = new int[len];
int Center = 0, Right = 0;
for(int i=0;i<len;i++){
int i_mirror = 2*Center-i;
p[i] = (Right > i) ? Math.min(Right-i, p[i_mirror]) : 0;
if(i-p[i]<0||i+p[i]>=len) continue;
while(s.charAt(i+p[i])==s.charAt(i-p[i])){
// System.out.println(i + ": ++");
p[i]++;
if(i-p[i]<0||i+p[i]>=len) break;
}
if(max<p[i]){
max =p[i];
c=i;
}
if (i + p[i] > Right) {
Center = i;
Right = i + p[i];
}
}
int t =(max-1)/2;
int z = c/2;
// System.out.println(t +" " +z);
if((max-1)%2==0){
return ss.substring(z-t,t+z);
}else{
return ss.substring(z-t,t+z+1);
}
}
String preProcess(String s) {
int n = s.length();
String ret = "";
for (int i = 0; i < n; i++)
ret += "#" + s.charAt(i);
ret +="#";
return ret;
}
}
有一个Manacher的算法,主要作用是不让p[i]从零开始计数,从而缩小计算范围