//输入一个字符串,求出其中最长的回文子串。子串的含义是:在原串中连续出现的字符片段。回文的含义是:正着看和倒着看相同,如abba和yyxyy。 //在判断时,应该忽略所有的标点和空格,且忽略大小写,但输出应该保留原样(在回文串的首部和尾部不要输出多余字符)。输出字符串长度不超 //过5000,且占据单独的一行。应该输出最长的回文串,如有多个,输出的起始位置靠左的。 //样例输入:Confuciuss say: Madam, I‘m Adam. //样例输出:Madam, I‘m Adam /////////////////////////////////////////////////////////////////////////////////////////// #if 0 #include <stdio.h> #include <string.h> #include <ctype.h> #define MAXN 5000 char buf[MAXN],s[MAXN]; int main(void) { int n, m = 0,max = 0; int i,j,k; fgets(buf,sizeof(s),stdin); n = strlen(buf); for(i = 0; i <= n; i++) { if(isalpha(buf[i])) { s[m++] = toupper(buf[i]); } } for(i = 0; i < m; i++) { for(j = i; j < m; j++) { int ok = 1; for(k = i; k <= j; k++) { if(s[k] != s[i+j-k]) { ok = 0; } } if(ok && j-i+1 > max) { max = j-i+1; } } } printf("max = %d\n",max); return 0; } #endif #if 1 #include <stdio.h> #include <string.h> #include <ctype.h> #define MAXN 5000 char buf[MAXN],s[MAXN]; int p[MAXN]; int main(void) { int n,m = 0,max = 0,x,y; int i,j; fgets(buf,sizeof(s),stdin); n = strlen(buf); for(i = 0; i < n; i++) { if(isalpha(buf[i])) { p[m] = i; s[m++] = toupper(buf[i]); } } for(i = 0; i < m; i++) { for(j = 0; i-j >=0 && i+j < m; j++) { if(s[i-j] != s[i+j]) { break; } if(j*2+1 > max) { max = j*2+1; x = p[i-j]; y = p[i+j]; } } for(j = 0; i-j >= 0 && i+j+1 <m; j++) { if(s[i-j] != s[i+j+1]) { break; } if(j*2+2 > max) { max = j*2+2; x = p[i-j]; y = p[i+j+1]; } } } for(i = x; i <= y; i++) { printf("%c",buf[i]); } printf("\n"); return 0; } #endif
时间: 2024-10-17 14:09:46