public static void longestPalindrome(String s) {
int a[];
int len[] = new int[s.length()*2 + 2];//记录每个的半径
char temp[] = new char[s.length()*2 + 2];//存储填充后的字符串
int p = 0;//记录当前回文串最长时最右端点的位置,初始时为$的变量值
int p0 = 1;//记录当前回文串最长时中心点的位置
len[0] = 1;
int left,right,max;
left = right = max = 0;
temp[0] = '$';
temp[1] = '#';
for(int i = 2; i < temp.length ; i++ ){
temp[i] = s.charAt((i - 1)/2);
i+= 1;
temp[i] = '#';
}
for(int i =1; i < temp.length; i++){
if(i >= p){
left = i;
right = i;
while(left > 0 && right < temp.length){
if(temp[left] == temp[right]){
max = right;
left = left - 1;
right = right + 1;
}else{
break;
}
}
len[i] = max - i + 1;
}
if(i < p){
if(len[2*p0 - i] < p - i){
len[i] = len[2*p0 - i];
}else{
left = p;
right = 2*i - p;
while(left > 0 && right < temp.length){
if(temp[left] == temp[right]){
max = right;
left = left - 1;
right = right + 1;
}else{
break;
}
}
len[i] = max - i + 1;
}
}
if(len[i] > len[p0]){
p0 = i;
p = max;
}
}
for(int i = 0; i < len.length; i++){
System.out.println(len[i]);
}
}
马拉车算法——求最长回文串长度
最新推荐文章于 2022-07-10 15:35:17 发布