| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 | 
							- package main
 
- func 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"))
 
- // }
 
 
  |