public class Manacher {
public static int find(char[] s){
assert(true);
int id = 1;//记录目前为止,最大回文的位置
int max = 1;//记录目前为止,最大回文的臂长
//保存字符的回文臂长
int[] r = new int[s.length+1];
for(int i=1; i<s.length-1; i++){
int j = id*2 - i;
if(i < max){
r[i] = r[j] > (max-i) ? max-i : r[j];
}else{
r[i] = 1;
}
while(s[i+r[i]]==s[i-r[i]]){
r[i]++;
}
if(i+r[i] > max){
max = i+r[i];
id = i;
}
}
int maxLength = 0;
for(int k=1; k<r.length;k++){
if(r[k] > maxLength){
maxLength = r[k];
}
}
return maxLength - 1;
}
/**
* @param args
*/
public static void main(String[] args) {
//前后加上两个标识符,循环控制在两个标识符之间,不能越界。
String s = "$#a#b#a#a#b#$";
int max = Manacher.find(s.toCharArray());
System.out.println(max);
}
}
最长回文字符串
最新推荐文章于 2022-04-19 19:36:23 发布