- Longest Palindromic Substring
Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring.
这道题求最长回文串,利用Manacher算法实现。
public String longestPalindrome(String s) {
//预处理,字母之间插入‘#’
StringBuilder sb=new StringBuilder();
sb.append("#");
int n=s.length();
for(int i=0;i<n;i++ ){
sb.append(s.charAt(i));
sb.append("#");
}
//rad[i]保存以i位置为中心的最长回文串
int newN=2*n+1;
int[] rad=new int[newN];
int id=-1; //最长回文串的索引
int mx=-1; //最长回文串的边界索引
int j; //对称点索引
for(int i=0;i<newN;i++){
if(i<=mx){
j =id*2-i;//i关于id的对称点
if(mx-i>rad[j])
rad[i]=rad[j];
else
rad[i]=mx-i;
}
while( i+rad[i]<newN && i-rad[i]>=0 && sb.charAt(i+rad[i])==sb.charAt(i-rad[i]))
rad[i]++;
if(i+rad[i]-1>mx){
mx=i+rad[i]-1;
id=i;
}
}
//找出最长的长度
id=0;
mx=0;
for(int i=0;i<newN;i++){
if(rad[i]>mx){
mx=rad[i];
id=i;
}
}
//找出字符串
StringBuilder res=new StringBuilder();
int i=id-mx+1;
while(i<id+mx-1){
if(sb.charAt(i)!='#')
res.append(sb.charAt(i));
i++;
}
return res.toString();
}