题目链接:https://leetcode-cn.com/problems/longest-palindromic-substring/
相关题目:最长回文子序列
动态规划
dp[i][j]表示从i到j是否为回文子串,若是则为true
注意对比和最长回文子序列的不同之处,最长回文子序列dp数组中保存的是回文子串的长度,而最长回文子串dp数组中保存的是0或1。
状态转移方程:
dp[i][j]=true; 当s[i]==s[j]&&dp[i+1][j-1]时
代码:
string longestPalindrome(string s) {
int n = s.size();
vector<vector<int>> dp(n, vector<int>(n, 0));
int len = 1, pos = 0;
for (int i = 0; i < n; i++) {
dp[i][i] = 1;
if (i > 0 && s[i] == s[i - 1]) {
dp[i - 1][i] = 1;
len = 2;
pos = i - 1;
}
}
for (int l = 3; l <= n; l++) {
for (int i = 0; i < n - l + 1; i++) {
int j = i + l - 1;
if (s[i] == s[j] && dp[i + 1][j - 1]) {
dp[i][j] = dp[i + 1][j - 1];
if (l > len) {
len = l;
pos = i;
}
}
}
}
return s.substr(pos, len);
}