1.题目解析
题目来源:516.最长回文子序列——力扣
测试用例
2.算法原理
1.状态表示
求某段字符的最长回文子序列长度需要知道原来的长度以及判断后续的值是否能与之前的回文子序列构成新的回文子序列,因此一维dp表显然无法满足要求,那么就需要用到二维dp表来存储[i,j]区间内的最长回文子序列长度
dp[i][j]:区间[i,j]内的最长回文子序列的长度
2.状态转移方程
判断回文子序列需要从两端开始判断,当两端相等就向中间判断,如果不等就需要更换区间并且取出最长回文串子序列的长度
3.初始化
填表时将对角线都初始化为1,下三角默认为0,因为即使用到了下三角的数值,0也不会影响填表,所以就不用进行初始化
4.填表顺序
填表时需要左下角的值或者左边与正下方的值,因此需要从下至上,每一行从左到右填表
5.返回值
由初始化可以知道只需要返回dp[0][n-1]即可
3.实战代码
代码解析
class Solution {
public:int longestPalindromeSubseq(string s) {int n = s.size();vector<vector<int>> dp(n, vector<int>(n));for (int i = n - 1; i >= 0; i--) {dp[i][i] = 1;for (int j = i + 1; j < n; j++) {if (s[i] == s[j]) {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][n - 1];}
};