hdu3068 最长回文子串问题.

来源:互联网 发布:淘宝商家提供发票不符 编辑:程序博客网 时间:2024/05/22 21:19

O(n)法求最长回文串,代码如下

#include<stdio.h>#include<stdlib.h>#include<string.h>int p[310000];char str[310000];int min(int a,int b){    return a<b?a:b;}int kp(int n){    int i;    int max=0;    int id,ans=1;;    for(i=1;i<n;i++)    {        if(max>i)            p[i]=min(p[2*id-i],max-i);        else            p[i]=1;        while(str[i+p[i]]==str[i-p[i]])            p[i]++;        if(p[i]+i>max)        {            max=p[i]+i;            id=i;        }        if(p[i]>ans)            ans=p[i];    }    return ans-1;}int main(){    int n,i;    char s[310000];    while(~scanf("%s",s))    {        memset(p,0,sizeof(p));        n=strlen(s);        str[0]='$';        str[1]='#';        for(i=0;i<n;i++)        {            str[i*2+2]=s[i];            str[i*2+3]='#';        }        n=n*2+2;        str[n]=0;        int l=kp(n);        printf("%d\n",l);          }    return 0;}

我也是从网上看大神们写的,最长回文子串问题详细求解过程以及解释请点击下面连接

最长回文子串问题

0 0