最长回文子串
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 }