o(n)时间复杂度求最长回文子串的manacher算法:
public class Solution {
public String longestPalindrome(String s) {
if(s.length()==0) return "";
StringBuffer sb=new StringBuffer();
for(int i=0;i<s.length();i++){
sb.append('$').append(s.charAt(i));
if(i==s.length()-1) sb.append('$');
}
int id=0,edge=1;
int idRe=0,maxRe=1;
s=sb.toString();
int[] dp=new int[s.length()];
dp[0]=1;
for(int i=1;i<s.length();i++){
if(i<edge){
dp[i]=Math.min(dp[id*2-i],edge-i);
}else{
dp[i]=1;
}
while(i-dp[i]>=0&&i+dp[i]<s.length()&&s.charAt(i-dp[i])==s.charAt(i+dp[i])){
dp[i]++;
}
if(dp[i]+i>edge){
id=i;
edge=dp[i]+i;
}
if(maxRe<dp[i]){
maxRe=dp[i];
idRe=id;
}
}
StringBuffer re=new StringBuffer();
int start=idRe-maxRe+2;
for(int i=start;i<=idRe*2-start;i+=2){
re.append(s.charAt(i));
}
return re.toString();
}
}