最长回文子串

 1 /*
 2 描述 
 3 输入一个字符串,求出其中最长的回文子串。子串的含义是:在原串连续出现的字符串片段。回文的含义是:正着看和倒着看是相同的,如abba和abbebba。在判断是要求忽略所有的标点和空格,且忽略大小写,但输出时按原样输出(首尾不要输出多余的字符串)。输入字符串长度大于等于1小于等于5000,且单独占一行(如果有多组答案,输出第一组)。 
 4 输入 
 5 输入一个测试数据n(1<=n<=10);
 6 随后有n行,每行有一个字符串。 
 7 输出 
 8 输出所要求的回文子串。 
 9 样例输入 
10 1
11 Confuciuss say:Madam,I'm Adam.样例输出 
12 Madam,I'm Adam
13 */
14 #include<stdio.h>
15 #include<string.h>
16 
17 char a[5050];
18 char b[5050];
19 int p[5050];
20 
21 void fun()
22 {
23     int i,j,n,max,x,y;
24     n=strlen(a);
25     for(i=0,j=0;i<n;i++)
26     {
27         if(a[i]>='a'&&a[i]<='z')
28         {
29             p[j]=i;
30             b[j++]=a[i];
31         }
32         else if(a[i]>='A'&&a[i]<='Z')
33         {
34             p[j]=i;
35             b[j++]=a[i]+32;
36         }
37     }
38     n=j;
39     max=0;
40     for(i=0;i<n;i++)
41     {
42         for(j=0;i-j>=0&&i+j<n;j++)
43         {
44             if(b[i-j]!=b[i+j]) break;
45             if(j*2+1>max) 
46             {
47                 max=j*2+1;
48                 x=p[i-j];
49                 y=p[i+j];
50             }
51         }
52         for(j=0;i-j>=0&&i+j+1<n;j++)
53         {
54             if(b[i-j]!=b[i+j+1]) break;
55             if(j*2+2>max)
56             {
57                 max=j*2+2;
58                 x=p[i-j];
59                 y=p[i+j+1];
60             }
61         }
62     }
63     for(i=x;i<=y;i++)
64         printf("%c",a[i]);
65     printf("\n");
66 }
67 int main()
68 {
69     int t;
70     scanf("%d",&t);
71     getchar();
72     while(t--)
73     {
74         gets(a);
75         fun();
76     }
77     return 0;
78 }

 

posted @ 2013-06-02 21:01  萧凡客  阅读(224)  评论(0编辑  收藏  举报