原题链接:https://leetcode-cn.com/problems/longest-palindromic-subsequence/
注意不是回文子串,子串必须是连续!
dp[i][j]表示字符串从i到j里最长的回文子序列长度
于是
当s[i]==s[j]时 dp[i][j]=dp[i+1][j-1]+2
当s[i]!=s[j]时,dp[i][j]=max(dp[i+1][j],dp[i][j-1])
最后返回dp[0][len-1]即可,下面展示自顶向下和自底向上两种代码。
代码(自顶向下):
int longestPalindromeSubseq(string s) {
int size = s.size();
vector<vector<int>> dp(size,vector<int>(size,0));
for(int i=0;i<size;i++) dp[i][i]=1;
for(int len=1;len<=size;len++){
for(int i=0;i<size-len;i++){
int j=i+len;
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]);//回文子序列不需要单独计算两个连续的情况,因为如果出现不相等的情况dp为1,而不是为0。注意和回文子串区分。
}
}
}
return dp[0][size-1];
}
代码(自底向上):
int longestPalindromeSubseq(string s) {
int size = s.size();
vector<vector<int>> dp(size,vector<int>(size,0));
for(int i=0;i<size;i++) dp[i][i]=1;
for(int i=size-1;i>=0;i--){
for(int j=i+1;j<size;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][size-1];
}