思路
- dp数组定义:[i, j]的字符串的最长回文子序列长度为dp[i][j]
- 递推公式:相等时,子序列+2 || i==j时赋值1; 不相等时,两个去掉首、去掉尾取最长
- dp数组初始化:都为0
- 遍历顺序:从下往上,左往右
- 时间复杂度:
代码
class Solution {
public:int longestPalindromeSubseq(string s) {vector< vector<int>> dp(s.size(), vector<int>(s.size(), 0));for(int i = s.size()-1; i>=0; i--){for(int j = i; j < s.size(); j++){if(s[i] == s[j]){if(j == i ){dp[i][j] = 1;}else{dp[i][j] = dp[i+1][j-1] + 2;}}else{dp[i][j] = max(dp[i][j-1], dp[i+1][j]);}}}return dp[0][s.size()-1];}
};