给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
示例 2:
输入: “cbbd”
输出: “bb”
思路:用Manacher
class Solution {
public String longestPalindrome(String s) {
if(s==null||s.length()==0)
return s;
char[] chs = s.toCharArray();
char[] chss=new char[chs.length*2+1];
int index=0;
for(int i=0;i<chss.length;i++){
if(i%2==0)
chss[i]='#';
else
chss[i]=chs[index++];
}
int max=1;
int res=0;//保存最长回文中心的位置
int[] help=new int[chss.length];
int c=-1;
int r=-1;
int j=0;
while(j!=help.length){
help[j]=j<r?Math.min(help[2*c-j],r-j):1;//1为自己
while(j+help[j]<help.length&&j-help[j]>=0&&chss[j+help[j]]==chss[j-help[j]]){
help[j]++;}
if(j+help[j]>r)
{r=j+help[j];
c=j;}
if(help[j]>=max)
{
res=j;
max=help[j];
}
j++;
}
StringBuilder sb=new StringBuilder();
for(int t=res-max+1;t<=res+max-1;t++){
if(chss[t]!='#')
sb.append(chss[t]);
}
return sb.toString();
}
}