[Leetcode] 132. Palindrome-partitioning-ii(DP)[難易度]

リンク

https://leetcode-cn.com/problems/palindrome-partitioning-ii/

時間がかかる

問題解決:32分
問題解決:25分

題名

文字列sを指定します。各部分文字列が回文になるように、sをいくつかの部分文字列に分割してください。

要件を満たす分割の最小数を返します。

アイデア

dp [i]は、s [0:i]の文字列の最小分割数を表します。

dp [i] = {0(s [0:i]は回文)min⁡j= 0 i − 1(dp [j] + 1)s [j + 1:i]が回文の場合Next(s [ 0:i]は回文文字列ではありません)dp [i] = \ begin {cases} 0 \ \ \ \ \ \ \ \ \ \(s [0:i]は回文文字列です)\\ \ min_ {j = 0} ^ {i-1}(dp [j] +1)s [j + 1:i]が回文の場合\ \(s [0:i]は回文ではありません)\ end {cases} d p [ i ]={{ 0 s [ 0          I ]リターンテキスト文字列j = 0I - 1d p [ j ]+1 in s j+1I ]リターンテキスト文字列がある場合の条件の下でS [ 0  I ]ではありませんへの復帰のテキスト文字列

回文文字列を判断します。is_palindrome[i] [j]は、s [i:j]が回文文字列であるかどうかを示します。

is _ palindrome [i] [j] = {true、i≥jis_palindrome [i + 1] [j −1]∧s[i] = = s [j]、それ以外の場合はis \ _palindrome [i] [j] = \ begin {cases} true、i \ geq j \\ is \ _palindrome [i + 1] [j-1] \ wedge s [i] == s [j]、それ以外の場合は\ end {cases} i s _ p a l i n d r o m e [ i ] [ j ]={{ t r u e ji s _ p a l i n d r o m e [ i+1 ] [ j1 ]s [ i ]= =s [ j ] O T H E R W I S E

時間計算量:O(n 2)O(n ^ 2)O n2

ACコード

class Solution {
    
    
public:
    int minCut(string s) {
    
    
        int n = s.size();
        vector<vector<bool>> is_palindrome(n, vector<bool>(n, true));
        for(int i = n-1; i >= 0; --i) {
    
    
            for(int j = i+1; j < n; ++j) {
    
    
                is_palindrome[i][j] = (is_palindrome[i+1][j-1] && s[i] == s[j]);
            }
        }
        
        vector<int> dp(n, n-1);
        dp[0] = 0;
        for(int i = 1; i < n; ++i) {
    
    
            if(is_palindrome[0][i]) {
    
    
                dp[i] = 0;
            }
            else {
    
    
                for(int j = 0; j < i; ++j) {
    
    
                    if(is_palindrome[j+1][i]) {
    
    
                        dp[i] = min(dp[i], dp[j]+1);
                    }
                }
            }
        }

        return dp[n-1];
    }
};

おすすめ

転載: blog.csdn.net/Krone_/article/details/114526109