【题目描述】

  如果一个字符串倒着读、顺着读的字符次序都一样,则该字符串称为“回文串”,如abcba、xxx是回文串。

现在给定一个随意的字符串,要求找出里面的最长的回文子串并输出其长度即可。

【输入】

  一个字符串。

【输出】

  该字符串包含的最长回文串的长度。


我的分析:

  使用动态规划的方法,将字符串中第i个字符(0 <= i < strlen(s))作为起始点,设为阶段;状态和决策则是从起始点至字串总长中,枚举每一区间的尾元素j(i <= j < strlen(s))和首元素k(i <= k <= j)。如果在区间内,第k个元素和第(i + j - k)个元素(即倒数第k个元素)相等,则累加当前回文串长度tmp(注:在区间内如果有一个元素不满足上述条件,则tmp变为零,继续下一次的循环),最后tmp再和之前所有回文串中最长的长度max进行比较,不断调整max。所有循环结束后输出max即可。


我的C++源代码:

#include <cstdio>
#include <cstring>

char s[257];
int max = -99999;

int main(void)
{
    scanf("%s", &s);
    for(int i = 0; i < strlen(s); i++) //阶段:以字符串中的每个字符依次作为开始的元素
        for(int j = i; j < strlen(s); j++) //当前字符串区间的尾元素
        {
            int tmp = 0;
            bool flag = true;
            for(int k = i; (k <= j)&&(flag); k++) //当前字符串区间的首元素
            {
                if (s[k] == s[i + j - k]) tmp++;  //如果当前区间的顺数第k个元素和倒数第k个元素(即顺数第i+j-k个元素)相同,则不断累加该区间的回文串长度
                else flag = false;
            }
            if ((tmp > max)&&(flag)) max = tmp; //累加完一次且该区间为回文串,则不断调整最大值
        }
    printf("%d\n", max);
    return 0;
}