最长回文字符串

来源:互联网 发布:数据存储的方式 编辑:程序博客网 时间:2024/05/21 18:32

最长回文子串

时间限制:1000 ms  |  内存限制:65535 KB
难度:4
描述
输入一个字符串,求出其中最长的回文子串。子串的含义是:在原串连续出现的字符串片段。回文的含义是:正着看和倒着看是相同的,如abba和abbebba。在判断是要求忽略所有的标点和空格,且忽略大小写,但输出时按原样输出(首尾不要输出多余的字符串)。输入字符串长度大于等于1小于等于5000,且单独占一行(如果有多组答案,输出第一组)。
输入
输入一个测试数据n(1<=n<=10);
随后有n行,每行有一个字符串。
输出
输出所要求的回文子串。
样例输入
1Confuciuss say:Madam,I'm Adam.
样例输出
Madam,I'm Adam


代码:

#include<stdio.h>#include<string.h>  #define MAX 5010 int main() {    int t,i,j,st,len,end,k,max;     int pos[MAX];     char s[MAX],s1[MAX];      scanf("%d",&t);     getchar();     while(t--)   {        gets(s);        len=strlen(s);         k=st=max=end=0;                 for(i=0;i<len;++i)                   {            if(s[i]>='a'&&s[i]<='z'||s[i]>='A'&&s[i]<='Z')                 {                pos[k]=i;                            if(s[i]<97)                             s1[k++]=s[i]+32;                 else                     s1[k++]=s[i];            }        }                      for(i=0;i<k;++i)//奇数          {                 for(j=0;j<=i&&i+j<k;++j)                     {                if(s1[i-j]!=s1[i+j])                    break;                 if(j*2+1>max)                {                    max=2*j+1;                     st=pos[i-j];                    end=pos[i+j];                }             }             for(j=0;j<=i&&i+j+1<k;++j)  //偶数                 {                 if(s1[i-j]!=s1[i+j+1])                    break;               if(j*2+2>max)                {                     max=2*j+2;                              st=pos[i-j];                     end=pos[i+j+1];                 }             }         }        for(i=st;i<=end;++i)            printf("%c",s[i]);         printf("\n");     }     return 0; }


ps:  说下这个题的处理思路  第一呢 就是字母全部提出来并且将大写转换为小写 当然反之亦然  第二个呢 就是要考虑到奇数回文字符串和偶数回文的区别   然后就是利用循环  暴力的搜出最大的解  输出就可以了。



0 0