题目大意:
输入一个字符串,求出其中最长的回文子串。子串的含义是:在原串中连续出现的字符串片段。回文的含义是:正着看和倒着看相同,如abba和yyxyy。在判断时,忽略所有标点符号和空格,且忽略大小写,但输出应保持原样(在回文串的首部和尾部不要输出多余字符)。输入字符串占据一行,长度不超过5000。输出最长的回文串,如果有多个,输出起始位置最靠左的。
样例输入:Confuciuss say: Madam, I’m Adam.
样例输出:Madam, I’m Adam
#include<stdio.h> #include<string.h> #include<ctype.h> #define MAXN 5000 + 10 char buf[MAXN], s[MAXN]; int p[MAXN]; // 记录字母在buf中的位置 int main(){ int n, m = 0, max = 0; int i, j, k, x = 0, y = 0; fgets(buf, sizeof(buf), stdin); n = strlen(buf); //预处理字符串 for (i = 0; i < n; i++) if (isalpha(buf[i])) { p[m] = i; s[m++] = toupper(buf[i]); } //printf("%s\n%s\n", buf, s); 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[j - (k - i)]) ok = 0; if (ok && max < j - i + 1) { max = j - i + 1; x = p[i]; y = p[j]; } } printf("%d\n", max); for (i = x; i <= y; i++) printf("%c", buf[i]); // getchar(); return 0; }
2018-03-29