132.leecode-Palindrome Partitioning II

这个题需要两个dp,一个保存从i到j是否为回文串

另一个保存0到i的最小的分割

下面是我的效率不太高的代码

class Solution {
public:
    int minCut(string s) {
        vector<vector<bool> > dp(s.size(), vector<bool>(s.size(), false));
        vector<int> res(s.size(), 0);
        
        //辅助数组
        for(int i = 0; i < s.size(); i++)
        {
            for(int j = i, k = 0; j < s.size(); j++, k++)
            {
                if(j-k <= 1) 
                    dp[k][j] = s[k] == s[j] ? true : false;
                else
                    dp[k][j] = (s[k] == s[j]) && (dp[k+1][j-1]);
            }
        }
        
        //如果0-i是回文串,那么不用切res[i]为0
        //如果j-i是回文串,那么res[i]为res[j-1]+1
        res[0] = 0;
        for(int i = 1; i < s.size(); i++)
        {
            res[i] = i;
            for(int j = 0; j <= i; j++)
            {
                if(dp[j][i]) 
                    res[i] = j == 0 ? 0 : min(res[i], res[j-1] + 1);
            }
        }
        return res[s.size()-1];
        
    }
};

猜你喜欢

转载自www.cnblogs.com/yangzixiong/p/10754822.html