【LeetCode] 516、最も長いパリンドローム配列

タイトル説明

文字列を与えられたs最長の回文配列を見つけるために、。これは、と仮定することができるs最大長1000

输入:"bbbab"
输出:4  // 一个可能的最长回文子序列为 "bbbb"。    注意是“子序列”

問題解決のためのアイデア

一般的な質問のサブシーケンスの問題は、我々は、ルーチンおよびソリューションマスターする必要があります。サブシーケンスの問題の一般的なアイデアを|最長の回文配列

  • 動的計画法(4つの要素):

    • 状態が表す:dp[i][j]表しsの第i二の文字jの文字からなる部分文字列を、パリンドローム配列の最長の長さです。

    • 状態遷移方程式:

      • もしs最初iの文字とj同じ言葉の文字:dp[i][j] = dp[i + 1][j - 1] + 2
      • もしs最初iの文字とj異なるものの文字:dp[i][j] = max(dp[i + 1][j], dp[i][j - 1])

      注:注横断方向のDP、とi最後の文字から、前方横断jからi + 1あなたは、各サブ質問が良いとされていることを確認することができますので、次のトラバーサルの始まり。(容易に利用可能な状態のビデオの状態遷移方程式に係る結論この遷移)

    • 初期設定:dp[i][i] = 1最長の回文配列は、単一の文字であるため、1

    • リターン結果:dp[0][n - 1]

参照コード

class Solution {
public:
    int longestPalindromeSubseq(string str) {
        int length = str.size();
        vector<vector<int> > dp(length, vector<int>(length, 0));
        for(int i = 0; i < length; i++)
            dp[i][i] = 1;
        for(int i = length-2; i >= 0; i--){
            for(int j = i+1; j < length; j++){
                if(str[i] == str[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][length-1];
    }
    
};
415元記事公開 ウォンの賞賛603 ビュー150,000 +を

おすすめ

転載: blog.csdn.net/ft_sunshine/article/details/104057684