132. 分割回文串 II

 

难度困难

给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文。

返回符合要求的 最少分割次数 。

 

示例 1:

输入:s = "aab"
输出:1
解释:只需一次分割就可将 s 分割成 ["aa","b"] 这样两个回文子串。

示例 2:

输入:s = "a"
输出:0

示例 3:

输入:s = "ab"
输出:1
 
class Solution:
    def minCut(self, s: str) -> int:
        n = len(s)


        n = len(s)
   
        dp = [[False] * n for _ in range(n)]
        for i in range(n):
            dp[i][i] = True
        for l in range(0,n)[::-1]:
            for r in range(l,n):
                if s[l] == s[r]:
                    if r - l <= 1:
                        dp[l][r] = True
                    else:
                        dp[l][r] = dp[l+1][r-1]
        dp2 = [float('inf')] * n
        for i in range(n):
            if dp[0][i]:
                dp2[i] = 0
            for j in range(i):
                if dp[j+1][i]:
                    dp2[i] = min(dp2[i],dp2[j]+1)
        return dp2[n-1]

 

 
 
 
class Solution {
public:
    int min_res = INT_MAX;
    int minCut(string s) {
        int n = s.size();
        vector<vector<bool>> dp =  vector<vector<bool>>(n,vector<bool>(n,false));
        for(int i = 0 ; i < n;i++) {
            dp[i][i] = true;
        }
        for(int end = 0; end < n ;end++) {
            for(int  start = end -1; start >=0;start--) {
                if (s[start]==s[end]) {
                    if (end-start<=1) {
                        dp[start][end] = true;
                    } else {
                        dp[start][end] = dp[start+1][end-1];
                    }
                }
            }
        }
        //  计算最小切割次数 dp
        vector<int> dp2 =  vector<int>(n,INT_MAX);
        for(int end = 0; end < n ;end++) {
            if (dp[0][end]) dp2[end] = 0;
            for(int  start = 0; start < end;start++) {
                if (dp[start+1][end]) {
                    dp2[end] = min(dp2[end],1 + dp2[start]);
                }
            }
        }
        return  dp2[n-1];
       
    }

};

 

posted @ 2022-07-27 17:55  乐乐章  阅读(27)  评论(0编辑  收藏  举报