最长回文子串

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

 1 /* 功能Function Description:     NYOJ-132  最长回文子串
 2    开发环境Environment:          DEV C++ 4.9.9.1
 3    技术特点Technique:
 4    版本Version:
 5    作者Author:                    可笑痴狂
 6    日期Date:                      20120730
 7    备注Notes:                    注意题目要求是忽略大小写和标点符号的,所以要事先做预处理
 8 */
 9 #include<stdio.h>
10 #include<string.h>
11 #include<ctype.h>   
12 #define MAX 5010
13 
14 int main()
15 {
16     int t,i,j,st,len,end,k,max;
17     int pos[MAX];
18     char s[MAX],s1[MAX];
19 
20     scanf("%d",&t);
21     getchar();
22     while(t--)
23     {
24         gets(s);
25         len=strlen(s);
26         k=st=max=end=0;        
27         for(i=0;i<len;++i)          //预处理
28         {
29             if(isalpha(s[i]))       //判断是不是字母 包含在头文件ctype.h中
30             {
31                 pos[k]=i;           //存数位置
32                 if(s[i]<97)         //把大写转化为小写字母
33                     s1[k++]=s[i]+32;
34                 else
35                     s1[k++]=s[i];
36             }
37         }
38             //    puts(s1);
39             //    for(i=0;i<k;++i)
40             //        cout<<pos[i];
41             //    cout<<endl;
42         for(i=0;i<k;++i)
43         {    
44             for(j=0;j<=i&&i+j<k;++j)        //回文字符数位奇数的情况
45             {
46                 if(s1[i-j]!=s1[i+j])
47                     break;
48                 if(j*2+1>max)
49                 {
50                     max=2*j+1;
51                     st=pos[i-j];
52                     end=pos[i+j];
53                 }
54             }
55             for(j=0;j<=i&&i+j+1<k;++j)     //回文字符数为偶数的情况
56             {
57                 if(s1[i-j]!=s1[i+j+1])
58                     break;
59                 if(j*2+2>max)
60                 {
61                     max=2*j+2;         
62                     st=pos[i-j];
63                     end=pos[i+j+1];
64                 }
65             }
66         }
67         for(i=st;i<=end;++i)
68             printf("%c",s[i]);
69         printf("\n");
70     }
71     return 0;
72 }

 

posted on 2012-07-30 16:50  可笑痴狂  阅读(2530)  评论(0)    收藏  举报