一、题目描述
Given a string s, find the longest palindromic subsequence's length in s. You may assume that the maximum length of s is 1000.
Example 1:
Input:
"bbbab"Output:
4One possible longest palindromic subsequence is "bbbb".
Example 2:
Input:
"cbbd"Output:
2One possible longest palindromic subsequence is "bb".
二、主要思想
动态规划解题,设二维数组dp[i][j]保存字符串s[i...j]的最长回文子序列长度
当左坐标l等于右坐标r时,最长回文子序列dp[l][r]=1;
状态转移方程:
如果s[i] == s[j], f[i][j] = f[i + 1][j - 1] + 2;
否则 f[i][j] = max(f[i + 1][j], f[i][j - 1]);
这里需要注意的是,l的取值必须从达到小取,因为若l从小往大取,则dp状态转移方程中取坐标为l+1的值则为默认的0,导致答案错误。
三、代码实现
class Solution {
public:
int longestPalindromeSubseq(string s) {
int n=s.length();
vector<vector<int>> dp(n,vector<int>(n));
if(n==0) return 0;
for(int l=n-1;l>=0;l--){
for(int r=l;r<n;r++){
if(l==r) dp[l][r]=1;
else{
if(s[l]==s[r])
dp[l][r]=dp[l+1][r - 1]+2;
else{
dp[l][r]=max(dp[l+1][r],dp[l][r-1]);
}
}
}
}
return dp[0][n-1];
}
};