【数组和字符串】3.3最长回文串

来源:互联网 发布:宇宙追缉令 知乎 编辑:程序博客网 时间:2024/05/17 09:08

样例:
Input:
Confuciuss say:Madom,I’m Adam.
Output:
Madam,I’m Adam.

#include<stdio.h>#include<string.h>#include<ctype.h>#define MAXN 5000+10char buf[MAXN],s[MAXN];int p[MAXN];//用P[i]来保存s[i]在buf中的位置 int main(){    int n,m=0,max=0,x,y;    int i,j,k;    fgets(buf,sizeof(s),stdin);    //读取完整的一行储存在字符数组buf中;     //该调用从标准输入流 stdin(也就是键盘输入)    //读入 s 数组的大小(sizeof(s))再减 1 的长度的字符到 buf 所指的内存空间中    n=strlen(buf);    for(i=0;i<n;i++)    {        if(isalpha(buf[i]))        {            p[m]=i;//用P[i]来保存s[i]在buf中的位置             s[m++]=toupper(buf[i]);        }        //isalpha 判断buf[i]是否为数组  toupper返回大写字母  头文件:ctype.h;         //同时m保存字母数;     }     /*    //枚举回文串的起点和终点并判断是否为回文串;     for(i=0;i<m;i++)    {        for(j=i;j<m;j++)        {            //判断s是否为回文串             int ok=1;            //引入变量 ok 参与判断             for(k=i;k<=j;k++)            {                if(s[k]!=s[i+j-k]) ok=0;            }            if(ok&&j-i+1>max) max=j-i+1;            //利用“当前最大值”变量 max 来保存当前发现的最长回文串的长度;          }    }    printf("max=%d\n",max);    */    //上述代码可获得最长回文串长度;    //由于字符可多达5000个,由生成一个5000个字符'a'的字符串可以发现程序效率会太低,运行速度过慢    //则我们可以枚举回文串的额中间位置'i'然后不断向外扩展,知道有字符不同;    //长度为奇数和偶数的回文串的处理方式是不同的;     for(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];                //在更新max的同时把p[i]和p[j]分别保存在x,y中,最后输出buf[x]和buf[y]中的所有字符;             }        }        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];            }        }    }     for(i=x;i<=y;i++)    {        printf("%c",buf[i]);            }       printf("\n");    return 0; } 
0 0