/*
dp(i,j)表示从 i-j的最长的回文子串的长度
i 从len-1 到 0
j 从 i+1 到j
if(s[i] == s[j]) {
dp(i,j) = dp(i+1, j-1) + 2
} else {
dp(i,j) = max(dp(i+1,j), dp(i, j-1));
}
*/
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string 一个字符串由小写字母构成,长度小于5000
* @return int
*/
int longestPalindromeSubSeq(string s) {
int len = s.size();
vector<vector<int>> dp(len, vector<int>(len, 0));
// dp(i,j)表示从i到j的最长回文子串长度。
// 初始化
for (int i = 0; i < len; i++) {
dp[i][i] = 1;
}
for (int i = len - 1; i >= 0; i--) {
for (int j = i + 1; j < len; j++) {
if (s[i] == s[j]) {
dp[i][j] = dp[i+1][j-1] + 2;
} else {
dp[i][j] = max(dp[i+1][j], dp[i][j-1]);
}
}
}
return dp[0][len-1];
}
};