| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 | package mainfunc minCutSlow(s string) int { // Too slow :(	n := len(s)	if n <= 1 {		return 0	}	cutCnt := make([]int, n+1)	cutCnt[0] = 1	for i := 0; i < n; i++ {		if cutCnt[i] != 0 {			for j := i + 1; j <= n; j++ {				if isPalindrome(s, i, j) {					if cutCnt[j] == 0 {						cutCnt[j] = cutCnt[i] + 1					} else if cutCnt[i] < cutCnt[j] {						cutCnt[j] = cutCnt[i] + 1					}				}			}		}	}	return cutCnt[n] - 2}func isPalindrome(s string, beg, end int) bool { // End is not included	for ; beg < end; beg, end = beg+1, end-1 {		if s[beg] != s[end-1] {			return false		}	}	return true}func minCut(s string) int {	n := len(s)	if n <= 1 {		return 0	}	dp := make([]int, n+1)	for i := 0; i <= n; i++ {		dp[i] = i - 1	}	for i := 0; i < n; i++ {		// For example, 'aba' and i = 1		for j := 0; 0 <= i-j && i+j < n && s[i-j] == s[i+j]; j++ {			if dp[i-j] < dp[i+j+1] {				dp[i+j+1] = dp[i-j] + 1			}		}		// For example, 'abba' and i = 1		for j := 1; 0 <= i-j+1 && i+j < n && s[i-j+1] == s[i+j]; j++ {			if dp[i-j+1] < dp[i+j+1] {				dp[i+j+1] = dp[i-j+1] + 1			}		}	}	return dp[n]}// func main() {// 	println(minCut("abb"))// 	println(minCut("aab"))// 	println(minCut("abbbbbb"))// }
 |