アルゴリズム質問チェックイン 57 日目 - 編集距離 | 647. 回文部分列、516. 最長回文部分列

647. 回文子串 - 力扣(LeetCode)

ステータス: アイデアなし

重要な点は、文字列 i ~ j が回文文字列であるかどうかを示す dp[i][j] を構築することです。コードは次のとおりです。

class Solution {
public:
    int countSubstrings(string s) {
        int len = s.size();
        int res = 0;
        vector<vector<bool>> dp(len, vector<bool>(len, false));
        for(int i = 0; i < len; ++i) dp[i][i] = true;
        for(int i = len-1; i >= 0; --i){
            for(int j = i; j < len; ++j){
                if(s[i] == s[j]){
                    if(j - i <= 1){
                        res++;
                        dp[i][j] = true;
                    }else if(dp[i+1][j-1]){
                        res++;
                        dp[i][j] = true;
                    }
                }
            }
        }
        return res;
    }
};

516. 最長の回文部分列 j - LeetCode

ステータス: アイデアをチェックした後、AC。

走査順序と初期化に注意してください。コードは次のとおりです。

class Solution {
public:
    int longestPalindromeSubseq(string s) {
        int len = s.size();
        vector<vector<int>> dp(len, vector<int>(len, 0));
        for(int i = 0; i < len; ++i) dp[i][i] = 1;
        for(int i = len-1; i >= 0; --i){
            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] = max(dp[i+1][j], dp[i][j-1]);
            }
        }
        return dp[0][len-1];
    }
};

おすすめ

転載: blog.csdn.net/qq_40395888/article/details/132707653