667. 最长的回文序列

2019-05-23  本文已影响0人  薄荷糖的味道_fb40

描述

给一字符串 s, 找出在 s 中的最长回文子序列的长度. 你可以假设 s 的最大长度为 1000.

样例

样例1

输入: "bbbab"
输出: 4
解释:
一个可能的最长回文序列为 "bbbb"
样例2

输入: "bbbbb"
输出: 5

思路:

dp[i][j]表示ij序列中最长回文序列的长度,那么显然dp[i][j]dp[i+1][j]dp[i][j-1]还有当s[i]=s[j]时候的dp[i+1][j-1]+2的最大值决定。具体实现如下。

class Solution {
public:
    /**
     * @param s: the maximum length of s is 1000
     * @return: the longest palindromic subsequence's length
     */
    int longestPalindromeSubseq(string &s) {
        // write your code here
        int n=s.size();
        if(!n)
        {
            return 0;
        }
        vector<vector<int>> dp(n,vector<int>(n,1));
        for(int i=0;i<n-1;i++)
        {
            dp[i][i+1]=s[i]==s[i+1]?2:1;
        }
        for(int len=3;len<=n;len++)
        {
            for(int i=0;i<=n-len;i++)
            {
                int j=i+len-1;
                dp[i][j]=max(dp[i][j-1],dp[i+1][j]);
                if(s[i]==s[j])
                {
                    dp[i][j]=max(dp[i+1][j-1]+2,dp[i][j]);
                }
                
            }
        }
        return dp[0][n-1];
    }
};
上一篇下一篇

猜你喜欢

热点阅读