题意
求最长的回文子串。如:cabbad是abba; cabad是aba
题解
- 直接枚举所有子串再判断是否是回文串会超时。
- 用动态规划解决。一个i到j的字符串是回文串的子问题是:i+1到j-1也是回文串。
状态转移方程为:dp[i][j] = true; (i ==j)
dp[i][j] = false; (s[i] != s[j])
dp[i][j] = dp[i + 1][j - 1] (s[i] == s[j] )
注意i == j-1, 此时i+1 > j-1,需要直接使dp[i][j] = true;
代码
class Solution {
public:
string longestPalindrome(string s) {
if (s.length() == 1)
return s;
int maxlen = 0, index = 0;
int len = s.length();
const int MAXLEN = 1000;
bool dp[MAXLEN][MAXLEN];
memset(dp, false, sizeof(dp));
for (int j = 1; j < len; j++)
for (int i = 0; i <= j; i++)
{
if (s[i] == s[j])
{
if (j - i <= 1)
dp[i][j] = true;
else
dp[i][j] = dp[i + 1][j - 1];
if (dp[i][j] && j - i + 1 > maxlen)
{
maxlen = j - i + 1;
index = i;
}
}
else
dp[i][j] = false;
}
return s.substr(index, maxlen);
}
};