最长回文子序列
题目
给你一个字符串 `s` ,找出其中最长的回文子序列,并返回该序列的长度。
子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。
示例 1:
输入 :s = "bbbab"
输出 :4
解释:一个可能的最长回文子序列为 "bbbb" 。
示例 2:
输入 :s = "cbbd"
输出 :2
解释:一个可能的最长回文子序列为 "bb" 。
提示:
- 1 <= s.length <= 1000
- s 仅由小写英文字母组成
状态表示
dp[i][j]
表示从索引i~j
区间的字符的最大回文子串。
状态转移方程
s[i]!=s[j]
dfs[i][j] = max(dfs[i+1][j], dfs[i][j-1])
s[i]==s[j]
dfs[i][j] = dfs[i+1][j-1]+2
推导过程
LeetCode 代码
c
class Solution {
public:
string st;
vector<vector<int>> memo;
int longestPalindromeSubseq(string s) {
st = s;
int n = s.size();
memo.resize(n, vector<int>(n, -1));
return dfs(0, n-1);
}
inline int dfs(int i, int j) {
if (i > j) return 0;
if (i == j) return 1;
int &res = memo[i][j];
if (res != -1) return res;
if (st[i] == st[j]) {
return res = 2 + dfs(i+1, j-1);
} else {
return res = max(dfs(i+1, j), dfs(i, j-1));
}
}
};