这里需要注意一下初始化:
需要考虑 i j 相等的情况
还有遍历顺序是逆序的
class Solution {
public:
int longestPalindromeSubseq(string s) {
vector<vector<int>> dp(s.size(), vector<int>(s.size(), 0));
for(int i = 0; i < s.size(); i++)
dp[i][i] = 1;
for(int i = s.size() - 1; i >= 0; i--) // 逆序遍历,因为递推公式的关系
{
for(int j = i + 1; j < s.size(); j++)
{
if(s[i] == s[j])
dp[i][j] = dp[i + 1][j - 1] + 2; // 同时加入 s[i] 、 s[j]
else
dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]); // 加入 s[i] 、 s[j] 的其中一个
}
}
return dp[0][s.size() - 1]; // 最后返回的结果是:字符串从下标 0 到 最后一个下标 的最长回文子序列的长度
}
};