容易思虑不周的地方:忘记最长字串为1的情况,此时应输出第一个字母(这题我贡献了7个WA,%>_<%)。
总结一下,预处理确实能带来很大便捷。
#include <stdio.h> #include <string.h> #include <ctype.h> #define max 5000 + 5 char str[max], buf[max]; int mark[max]; //找到buf数组中的元素对应的str元素的位置 int maxlen, maxl, maxr; //最长子串长度,左标,右标 bool check(int i, int j){ while(i < j){ if(buf[i] == buf[j]) ++i, --j; else break; } if(i >= j) return 1; return 0; } void findMaxlen(){ int i, j, len; len = strlen(buf); maxl = maxr = 0; for(i = 0, maxlen = 1; i < len; ++i){ for(j = i + 1; j < len; ++j){ if(buf[i] == buf[j] && j - i > maxlen && check(i, j)) maxl = i, maxr = j, maxlen = j - i + 1; } } } int main(){ int n, len, i, j; scanf("%d\n", &n); while(n--){ gets(str); len = strlen(str); for(i = j = 0; i != len; ++i) if(isalpha(str[i])) buf[j++] = toupper(str[i]), mark[j-1] = i;; buf[j] = '\0'; findMaxlen(); for(i = mark[maxl]; i <= mark[maxr]; ++i) putchar(str[i]); putchar('\n'); } return 0; }
803584 | 长木 | 最长回文子串 | Accepted | 36 | 260 | C/C++ | 04-09 10:18:37 |