最長迴文子串

來源:互聯網
上載者:User

標籤:blog   os   for   io   演算法   div   

[i,j]是迴文串 若 str[i-1]==str[j+1]則 [i-1,j+1]也是迴文串。

#include<stdio.h>#include<iostream>#include<string.h>#include<queue>#include<stack>#include<list>#include<stdlib.h>#include<algorithm>#include<vector>#include<map>#include<set>using namespace std;int Max(int a,int b){    return a>b?a:b;}char str[1111111];int dp[5555][5555];int main(){    int n;    while(~scanf("%d",&n)!=EOF){        for(int k=0;k<n;k++){            int ans=0;            scanf("%s",str+1);            memset(dp,0,sizeof(dp));            for(int i=1;str[i];i++){                dp[i][i]=1;                if(str[i]==str[i+1])                    dp[i][i+1]=1;            }            int len=0;            for(int i=1;str[i];i++)                len++;            for(int i=1;i<=len;i++){                for(int j=1;j+i<=len;j++){                    int cc=i+j;                    if(str[j]==str[cc])                        if(dp[j+1][cc-1]) dp[j][cc]=1;                    if(dp[j][cc]) ans=Max(ans,i+1);                  //  printf("%d %d %d",i,i+j,dp[i][j+i]);system("pause");                }            }            printf("%d\n",ans);        }    }    return 0;}

  從中間向兩邊跑

#include<stdio.h>#include<iostream>#include<string.h>#include<queue>#include<stack>#include<list>#include<stdlib.h>#include<algorithm>#include<vector>#include<map>#include<set>#include <fstream>using namespace std;string expand(string s1,int a,int b){    int l=a;int r=b;    int len=s1.length();    while(l>=0&&r<len&&s1[l]==s1[r]){        l--;r++;    }    return s1.substr(l+1,r-l-1);}string Max(string a,string b){    if(a.length()>b.length())        return a;    else        return b;}string str;int main(){    int n;    while(scanf("%d",&n)!=EOF){        for(int k=0;k<n;k++){            cin>>str;            string longest = str.substr(0,1);            int len=str.length();            for(int i=0;i<len;i++){                longest=Max(longest,expand(str,i,i));              //  printf("%d ",i);              //  cout<<longest<<endl;              //  system("pause");            }            for(int i=0;i<len;i++){                if(str[i]==str[i+1])                    longest=Max(longest,expand(str,i,i+1));            }            printf("%d\n",longest.length());        }    }    return 0;}

  O(n)的演算法。

#include<stdio.h>#include<iostream>#include<string.h>#include<queue>#include<stack>#include<list>#include<stdlib.h>#include<algorithm>#include<vector>#include<map>#include<set>#include <fstream>using namespace std;int Min(int a,int b){    return a>b?b:a;}int p[1111111];char str[1111111],s1[1111111];int len;void pk(){    int mx=0;int id;    for(int i=1;i<len;i++){        if(mx>i){            p[i]=Min(p[id*2-i],mx-i);        }        else            p[i]=1;        for(;s1[i-p[i]]==s1[i+p[i]];p[i]++);        if(p[i]+i>mx){            mx=p[i]+i;            id=i;        }    }}int main(){    int n;    while(scanf("%d",&n)!=EOF){    for(int i=0;i<n;i++){        scanf("%s",str);        s1[0]=‘.‘;        s1[1]=‘#‘;        len=strlen(str);        for(int j=0;j<len;j++){            s1[2*j+2]=str[j];            s1[2*j+3]=‘#‘;        }        len=len*2+1;        int ans=0;        pk();        for(int i=1;i<len;i++)            if(ans<p[i]) ans=p[i];        printf("%d\n",ans-1);    }    }    return 0;}

  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.