最大回文子串(忽略标点和空格)
代码
1 //最小回文子串,忽略标点和空格 2 #include<stdio.h> 3 #include<string.h> 4 #include<ctype.h> 5 #define MAXN 5000+10 6 7 char buf[MAXN],s[MAXN]; 8 int p[MAXN]; 9 int main() 10 { 11 int n,m=0; 12 fgets(buf,sizeof(s),stdin); 13 n=strlen(buf); 14 for(int i=0;i<n;i++) 15 { 16 if(isalpha(buf[i])) 17 { 18 p[m]=i; 19 s[m++]=toupper(buf[i]); 20 } 21 } 22 printf("%s\n",s); 23 24 int max=0,x=0,y=0; 25 26 27 //未优化方法 28 /*for(i=0;i<m;i++) //用这种方式需要三重循环,且看下面的另一种方式 29 { 30 31 for(int j=i;j<m;j++) 32 { 33 int ok=1,k; 34 for(k=0;k<=(j-i)/2;k++) 35 { 36 if(s[i+k]!=s[j-k]) 37 { 38 ok=0; 39 break; 40 } 41 } 42 if(ok&&j-i+1>max) 43 { 44 max=j-i+1; 45 x=p[i]; 46 y=p[j]; 47 } 48 } 49 }*/ 50 51 //优化方法 52 for(i=0;i<m;i++) //这种以i为中心,向两边扩展检测的方式只需二重循环,但要分奇偶两次内循环 53 { 54 int k; 55 for(k=0;i-k>=0&&i+k<m;k++)//回文串有奇数个,s[i]出于回文串中间 56 { 57 if(s[i-k]!=s[i+k]) break; // if(s[i-k]!=s[i+k]) 58 // { 59 if(2*k+1>max) // if(2*(k-1)+1>max) 60 { // { 61 max=2*k+1; // max=2*(k-1)+1; 62 x=p[i-k]; // x=p[i-(k-1)]; 63 y=p[i+k]; // y=p[i+(k-1)]; 64 } // } 65 // break; 66 // } 如果写成这种语句块,当最大回文串出现在开头或者结尾处时,由于for循环首先判断出i-k<0或者i+k>m, 67 } // 致使循环for循环直接结束,无法进入if(2*(k-1)+1>max)语句块,使得max,x,y更新失败,出现错误 68 69 for(k=0;i-k>=0&&i+k+1<m;k++) //回文串有偶数个,s[i]出于回文串中间偏左 70 { 71 if(s[i-k]!=s[i+k+1]) break; // if(s[i-k]!=s[i+k+1]) 72 // { 73 if(2*k+2>max) // if(2*(k-1)+2>max) 74 { // { 75 max=2*k+2; // max=2*(k-1)+2; 76 x=p[i-k]; // x=p[i-(k-1)]; 77 y=p[i+k+1]; // y=p[i+(k-1)+1]; 78 } // } 79 // break; 80 // } 错误原因同上。 81 } 82 } 83 84 85 86 printf("最长回文子串为(仅字符长度):%d\n",max); 87 for(i=x;i<=y;i++) putchar(buf[i]); 88 putchar('\n'); 89 return 0; 90 }