LeetCode - Palindrome Partitioning II

dp[i] - s的前i位需要最少的cut数

dp[i] = min(dp[i], dp[j]+1)

initialize dp[0] to -1 用来跟+1抵消

class Solution {
public:
    int minCut(string s) {
        int n = s.size();
        if(n<2) return 0;
        vector<int> dp(n+1, n);
        dp[0] = -1;
        for(int i=1;i<=n;i++){
            for(int j=0;j<i;j++){
                if(isvalid(s.substr(j, i-j))){  //i-1-j+1=i-j
                    dp[i] = min(dp[i], dp[j]+1);
                }
            }
        }
        return dp[n];
    }
    bool isvalid(string s){
        int l=0, r=s.size()-1;
        while(l<r){
            if(s[l]!=s[r]) return false;
            l++;
            r--;
        }
        return true;
    }
};

利用DP进一步优化[check是不是回文]的部分

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

猜你喜欢

转载自blog.csdn.net/real_lisa/article/details/83747099
今日推荐