看到这个题第一个想法就是枚举所有的子串,然后再一个一个判断是否回文。显然,在最大串长度足足有5000个字符的情况下,肯定会超时。
这时可以用另一种思想:
子串为奇数时,以一个字符为中心,依次比较这个字符左边和其对应的右边的字符是否相等,如果相等则说明这是一个回文串。
子串为偶数时,比较当前字符跟上一个字符是否相等,然后再向两边拓展,比较。
代码如下:
#include <stdio.h> #include <string.h> char ch[5010]; int main(int argc, char *argv[]) { int len = 0,i,j,k; while(scanf("%s",&ch) != EOF) { long tot = 0; len = strlen(ch); /* 以一个字符为中心向两边扩展. */ for(i = 1 ; i < len ; ++i) { for(j = i - 1,k = i + 1; j >= 0 && k < len ; --j,++k) /* 当子串为奇数时 */ { if(ch[j] != ch[k]) break; ++tot; } for(j = i - 1,k = i ; j >= 0 && k < len ; --j,++k) /* 处理子串为偶数的情况 */ { if(ch[j] != ch[k]) break; ++tot; } } tot += len; /* 单独的一个字符也算是一个回文 */ printf("%ld\n",tot); } return 0; }
aba aa
4 3