516. 最长回文子序列(leetcode)
题目描述
给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度。
子序列定义为:不改变剩余字符顺序的情况下,删除某些字符或者不删除任何字符形成的一个序列。
示例1
输入:s = “bbbab”
输出:4
解释:一个可能的最长回文子序列为 “bbbb” 。
示例2
输入:s = “cbbd”
输出:2
解释:一个可能的最长回文子序列为 “bb” 。
提示信息
1 <= s.length <= 1000
s 仅由小写英文字母组成
题解1(C++版本)
class Solution {
public:
int longestPalindromeSubseq(string s) {
// 本题相当于求字符串s和字符串t的最长公共子序列的长度,其中,字符串t表示字符串s的反转后的字符串
int n = s.size();
vector<vector<int> > dp(n + 1, vector<int>(n + 1, 0)); // dp[i][j]:字符串s在[i, j]范围内最长的回文子序列的长度
for(int i = 1; i <= n; i++) dp[i][i] = 1;
for(int i = n; i > 0; i--){
for(int j = i + 1; j <= n; j++){
if(s[i - 1] == s[j - 1]) dp[i][j] = dp[i + 1][j - 1] + 2;
else dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]);
}
}
return dp[1][n];
}
};