笔试面试题(8)---回文子串

来源:互联网 发布:淘宝助理下架在哪里 编辑:程序博客网 时间:2024/06/05 03:23

1、验证整个字符串是不是回文(最简单的了)

      直接验证或递归验证都可以....

2、求连续的回文子串,如:abdadbx,则回文子串就是bdadb

      整个有一个最优的算法为:“中心法求最长回文子串”(线性复杂度),具体的博客:http://www.cnblogs.com/wuyiqi/archive/2012/06/25/2561063.html写的真好!

    

#include<cstdio>#include<cstring>const int M = 110010*2;char str[M];//start from index 1int p[M];char s[M];int n;void checkmax(int &ans,int b){    if(b>ans) ans=b;}inline int min(int a,int b){    return a<b?a:b;}void kp(){    int i;    int mx = 0;    int id;    for(i=1; i<n; i++){        if( mx > i )            p[i] = min( p[2*id-i], p[id]+id-i );        else            p[i] = 1;        for(; str[i+p[i]] == str[i-p[i]]; p[i]++) ;        if( p[i] + i > mx ) {            mx = p[i] + i;            id = i;        }    }}void pre(){    int i,j,k;    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;}void pt(){    int i;    int ans = 0;    for(i=0;i<n;i++)        checkmax(ans, p[i]);    printf("%d\n", ans-1);}int main(){    int T,_=0;    while( scanf("%s", s) !=EOF )    {        pre();        kp();        pt();    }    return 0;}


 

     如果用动态规划的用O(n^2)吧

#include <iostream>#include <cmath>using namespace std;#define MAXLEN 1000int maxlen[MAXLEN][MAXLEN];int LongestLen(char str[], int slen){    int i, j, len;    for (i = 0; i < slen; i++)    {        maxlen[i][i] = 1;    }    for (len = 1; len < slen; len++)    {        for (i = 0; i <= slen - len; i++)        {            j = i + len;            if (str[i] == str[j])            {                if (i + 1 > j - 1)                {                    maxlen[i][j] = 2;                }                else                {                    maxlen[i][j] = 2 + maxlen[i + 1][j - 1];                }            }            else            {                maxlen[i][j] = maxlen[i + 1][j]> maxlen[i][j - 1]?  maxlen[i + 1][j]:maxlen[i][j - 1];            }        }    }    return maxlen[0][slen - 1];}int main(){    char str[1000];    cin>>str;    int ans=LongestLen(str,strlen(str));    cout<<ans<<endl;    return 0;}

 3、如果要可以不连续的回文子串,只能用DP了,中心扩展法是求不了的。

0 0
原创粉丝点击