给你一个字符串 s
,找到 s
中最长的回文子串。
示例 1:
输入:s = "babad" 输出:"bab" 解释:"aba" 同样是符合题意的答案。
示例 2:
输入:s = "cbbd" 输出:"bb"
示例 3:
输入:s = "a" 输出:"a"
示例 4:
输入:s = "ac" 输出:"a"
提示:
1 <= s.length <= 1000
s
仅由数字和英文字母(大写和/或小写)组成
思路:动态规划
- 数组元素的含义
dp[i][j] = true : s[i:j] 为回文串;
- 递归计算式:
dp[i][j] = dp[i+1][j-1] && (s[i] == s[j]) ; j-i > = 2
- 初始值:
dp[i][i] = true;
dp[i][i+1] = (s[i] == s[j])
代码:
class Solution {
public:
string longestPalindrome(string s) {
// 长度为0
if (s.empty()) return "";
// 长度为1
int slen = s.size();
if (slen == 1) return s;
// dp[i][j]
vector<vector<bool>> dp(slen, vector<bool>(slen));
// init
int start = 0;
int len = 1;
for (int i = 0 ; i < slen; i++)
{
dp[i][i] = true;
if (i < slen-1)
{
if (s[i] == s[i+1])
{
start = i;
len = 2;
dp[i][i+1] = true;
}
}
}
// compute
for(int l=2; l<slen; l++)
{
for(int i=0; i<slen-l; i++) {
dp[i][i+l] = dp[i+1][i+l-1] &&(s[i]==s[i+l]);
if (dp[i][i+l])
{
start = i;
len = l+1;
}
}
}
return s.substr(start, len);
}
};