题目
给定一个字符串,求字符串中最长回文长度。例:aferegga最长回文长度为5(回文为aerea)。
解题思路
从字符串两端入手,对比两端字符,如果相等,则转向求中间所夹字符串中最长回文长度。如果不相等,则分别求除左、右端字符所剩字符串中最长回文长度,然后比较得出最长回文长度。
可以用递归或动态规划算法求解。
/*递归算法*/
- #include <iostream>
- #include <algorithm>
- #include <cstring>
- using namespace std;
- int MaxLength(char str[], int i, int j)
- {
- if (i == j)
- {
- return 1;
- }
- else if (i > j)
- {
- return 0;
- }
- else
- {
- if (str[i] == str[j])
- {
- return 2 + MaxLength(str, i + 1, j - 1);
- }
- else
- {
- return max(MaxLength(str, i + 1, j), MaxLength(str, i, j - 1));
- }
- }
- }
- int main()
- {
- char str[1000];
- int len;
- while (cin >> str)
- {
- len = strlen(str);
- cout << MaxLength(str, 0, len - 1) << endl;
- }
- return 0;
- }
/*动态规划*/
- #include <iostream>
- using namespace std;
- #define MAXLEN 1000
- int maxlen[MAXLEN][MAXLEN];
- int LongestLen(char str[], int slen)
- {
- int i, j, len;
- for (i = 0; i < slen; i++)
- {
- maxlen[i][i] = 1;
- }
- for (len = 1; len < slen; len++)
- {
- for (i = 0; i <= slen - len; i++)
- {
- j = i + len;
- if (str[i] == str[j])
- {
- if (i + 1 > j - 1)
- {
- maxlen[i][j] = 2;
- }
- else
- {
- maxlen[i][j] = 2 + maxlen[i + 1][j - 1];
- }
- }
- else
- {
- maxlen[i][j] = max(maxlen[i + 1][j], maxlen[i][j - 1]);
- }
- }
- }
- return maxlen[0][slen - 1];
- }
- int main()
- {
- char str[MAXLEN];
- int slen;
- while (cin >> str)
- {
- slen = strlen(str);
- cout << LongestLen(str, slen) << endl;
- }
- return 0;
- }