题目:
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"
题解:
动态规划:
思路: 要判断s[i,…,j]是否为回文串. 分情况讨论.
如果s[i] == s[j], 只要s[i+1,…,j-1]是回文串. s[i,…,j]一定是回文串.
例如: “ababa”
“bab”是回文串. a==a, “ababa” 一定是回文串.
设dp[i][j]表示s[i,…,j]是否是回文串.
当i==j时, 单个字符, 是回文串. d[i][j]=1;
当i+1==j时, 两个字符. 此时, s[i]==s[j]时, d[i][j]=1;
其它, 当s[i]==s[j] 且 s[i+1,…,j-1]是回文串时, d[i][j]=1;
代码
string longestPalindrome(string s) {
std::vector<std::vector<int>> dp(s.length(), std::vector<int>(s.length(), 0));
int nMaxLength = 0;
string strResult = "";
for (int len = 1; len <= s.length(); ++len)
{
for (int i = 0; i + len <= s.length(); ++i)
{
int j = i + len - 1;
if (len == 1)
{
dp[i][j] = 1;
}
else if (len == 2)
{
dp[i][j] = s[i] == s[j] ? 1 : 0;
}
else
{
dp[i][j] = (s[i] == s[j] && dp[i + 1][j - 1]) ? 1 : 0;
}
if (dp[i][j] && len > nMaxLength)
{
nMaxLength = len;
strResult = s.substr(i, len);
}
}
}
return strResult;
}