给定一个字符串s
,找到其中最长的回文子序列。可以假设s
的最大长度为1000
。
示例 1:
输入:
"bbbab"
输出:
4
一个可能的最长回文子序列为 "bbbb"。
示例 2:
输入:
"cbbd"
输出:
2
可能的最长回文子序列为 "bb"。
这道题是求最长回文子序列(不一定要连续)。而回文序列有一个特点在于它反序之后还是相同的,根据这一特点,最长回文子序列可以将原来的子序列取反,求两个字符串的最长公共子序列就是结果
code:
class Solution {
public:
int longestPalindromeSubseq(string s) {
//反序求最长公共子序列
string t =s;
reverse(t.begin(),t.end());
return lcs(s,t);
}
int lcs(string s,string t)
{
int n=s.size();
if(n<=1)return n;
int dp[n+1][n+1]={0};
for(int i=0;i<=n;i++){dp[0][i]=0;dp[i][0]=0;}
for(int i=1;i<=n;i++)
{ for(int j=1;j<=n;j++)
{
if(s[i-1]==t[j-1])dp[i][j]=dp[i-1][j-1]+1;
else{
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
}
return dp[n][n];
}
};