Skip to content

Latest commit

 

History

History
61 lines (53 loc) · 1.12 KB

File metadata and controls

61 lines (53 loc) · 1.12 KB

回文串切割

def min_cut(s):
    """
    :type s: str
    :rtype: int
    """

    n = len(s)

    is_palindrome = [[True for _ in range(n)] for _ in range(n)]
    for i in range(n):
        for j in range(i):
            is_palindrome[j][i] = s[j] == s[i] and is_palindrome[j + 1][i - 1]

    dp = [i for i in range(n)]
    for i in range(n):
        if is_palindrome[0][i]:
            dp[i] = 0
        else:
            for j in range(1, i + 1):
                if is_palindrome[j][i]:
                    dp[i] = min(dp[i], dp[j - 1] + 1)

    return dp[-1]
package main

func minCut(s string) int {
	n := len(s)
	isPalindrome := make([][]bool, n)
	for i := 0; i < n; i++ {
		isPalindrome[i] = make([]bool, n)
	}
	for i := 0; i < n; i++ {
		for j := i; j >= 0; j-- {
			if s[j] == s[i] && (i-j <= 1 || isPalindrome[j+1][i-1]) {
				isPalindrome[j][i] = true
			}
		}
	}
	dp := make([]int, n)
	for i := 1; i < n; i++ {
		dp[i] = i
		if isPalindrome[0][i] {
			dp[i] = 0
		} else {
			for j := 1; j <= i; j++ {
				if isPalindrome[j][i] {
					dp[i] = min(dp[i], dp[j-1]+1)
				}
			}
		}
	}
	return dp[n-1]
}