最长回文子串的长度 南邮NOJ 1968

来源:互联网 发布:数据仓apriori算法 编辑:程序博客网 时间:2024/05/20 21:44

最长回文子串的长度

时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte
总提交 : 322            测试通过 : 62 

题目描述

输入一个字符串,求出其中最大回文子串的长度。子串的含义是:在原串中连续出现的字符串片段。回文的含义是:正着看和倒着看相同,如abba和yyxyy。在判断时,应该忽略所有标点符号和空格,且忽略大小写,但输出应保持原样(在回文串的首部和尾部不要输出多余字符)。

输入

输入字符串长度不超过5000,且占据单独的一行。

输出

输出最长回文串的长度,该回文串不包括所有标点符号和空格。

样例输入

Confuciuss say: Madam,I'm Adam.

样例输出

11

提示

undefined

/*枚举回文串中的"中间"位置,然后不断向外扩展,直到有字符不同。*/#include<stdio.h>#include<string.h>#include<ctype.h>#define MAXN 5000+10char buf[MAXN],s[MAXN];int p[MAXN];int main(){    int n,m=0,max=0,x,y;    int i,j;    fgets(buf,sizeof(s),stdin);    n=strlen(buf);    for(i=0;i<n;i++)    {        if(isalpha(buf[i]))        {            p[m]=i;            s[m++]=toupper(buf[i]);        }    }    for(int i=0;i<m;i++)    {        for(j=0;i-j>=0&&i+j<m;j++)        {            if(s[i-j]!=s[i+j]) break;            if(j*2+1>max) {max=j*2+1;x=p[i-j];y=p[i+j];}        }        for(j=0;i-j>=0&&i+j+1<m;j++)        {            if(s[i-j]!=s[i+j+1]) break;            if(j*2+2>max) {max=j*2+2;x=p[i-j];y=p[i+j+1];}        }    }    int cnt=0; //统计字母长度    for(i=x;i<=y;i++)    {        if(isalpha(buf[i]))           cnt++;    }    printf("%d\n",cnt);    return 0;}
这一题和求最长回文字串很相似,只不过本题比后者多了统计最长回文子串中的字母数目这部分~
0 0
原创粉丝点击