?题目描述
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
示例 2:
输入: "cbbd"
输出: "bb"
?Solution :
对于字符串str,假设dp[i,j]=1表示str[i...j]是回文子串,那个必定存在dp[i+1,j-1]=1。这样最长回文子串就能分解成一系列子问题,可以利用动态规划求解了。
initial state:
- dp[i][i]=1 意义是单个字符,是回文串。
- dp[i][i+1]=1 if str[i]==str[i+1] 两个相同字符,是回文串。
class Solution {
public:
string longestPalindrome(string s) {
int len = s.size();
if (len == 0)return "";
if (len < 2)return s;
int start = 0;
int longest = 1;
vector <vector<int>> dp(len, vector<int>(len));
for (int i = 0; i < len; i++) {
dp[i][i] = 1;
if (i < len - 1) {
if (s[i] == s[i + 1]) {
dp[i][i + 1] = 1;
start = i;
longest = 2;
}
}
}
for (int l = 3; l <= len; l++) {
for (int i = 0; i + l - 1 < len; i++) {
int j = i + l - 1;
if (s[i] == s[j] && dp[i + 1][j - 1] == 1) {
dp[i][j] = 1;
start = i;
longest = l;
}
}
}
return s.substr(start, longest);
}
};