516

Given a string s, find the longest palindromic subsequence's length in s. You may assume that the maximum length of s is 1000.

dp.

这个最长的镜像子序列不一定是连续的。比如说bbab的最长镜像子序列就是bbb。创建一个dp二维数组,dp[i][j]表示字符串中第i位到第j位之间的最大镜像子序列的长度。

basic step: dp[i][i]=1

state transition:若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[i][j]=max(dp[i+1][j-1]+2,dp[i][j-1],dp[i+1][j-1])也是可以,不过其实只要简化版就足够了。

class Solution {
public:
    int longestPalindromeSubseq(string s) {
        int len=s.length();
        vector<vector<int>>dp(len,vector<int>(len));
        for(int i=len-1;i>=0;i--)
        {
            dp[i][i]=1;
            for(int j=i+1;j<len;j++)
            {
                if(s[i]==s[j])
                {
                    dp[i][j]=dp[i+1][j-1]+2;
                }
                else 
                {
                    dp[i][j]=dp[i+1][j]>dp[i][j-1]?dp[i+1][j]:dp[i][j-1];
                }
            }
        }
        return dp[0][len-1];
    }
};
原文地址:https://www.cnblogs.com/KRCheung/p/6822654.html