516. 最长回文子序列

给定一个字符串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];
    }
};

猜你喜欢

转载自blog.csdn.net/xuxuxuqian1/article/details/80896079