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 协议 ,转载请注明出处!

二分 Previous
CodeForces 888E 折半搜索 Next