1.暴力法:求出所有子串…
2.动态规划法:
定义二维数组P[i,j]用以表示Si…Sj是回文(true)或不是回文(false)
那么可知P[i,j] = (P[i + 1, j - 1] && Si ==Sj)
初始条件是:P[i, i]=true,P[i, i + 1] = (Si == Si+1)
int dp[1010][1010]={0};
int main()
{
int i,j,max=1,len;
char a[1010];
gets(a);
for(i=0;i<strlen(a);i++)
dp[i][i]=1;
for(i=0;i<strlen(a)-1;i++)
if(a[i]==a[i+1])
{
dp[i][i+1]=1;
max=2;
}
for(len=3;len<=strlen(a);len++)
for(i=0;i<strlen(a)-len+1;i++)
{
j=i+len-1;
if(dp[i+1][j-1]==1&&a[i]==a[j])
{
dp[i][j]=1;
if(j-i+1>max)max=j-i+1;
}
else dp[i][j]=0;
}
printf("%d\n",max);
return 0;
}
3.中心扩展法:回文的特点,就是中心对称。对于有N个字符的字符串S,只有2N-1个中心。为何是2N-1?因为两个字符之间的空档也可以是一个中心。例如”abba”的两个b中间就是一个中心。
4.Manacher算法:
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!