| 1234567891011121314151617181920212223242526272829303132333435 | func strangePrinter(s string) int {	n := len(s)	dp := make([][]int, n)	for i := range dp {		dp[i] = make([]int, n)	}	// dp[i][j] means the min move to build string s[i:j+1].	// So, dp[i][j] = 0, j < i (empty string)	//              = dp[i][j-1] + 1 (init)	//              = min(dp[i][j], dp[i][k]+dp[k+1][j-1]), s[k] == s[j]	return dfs(s, 0, n-1, dp)}func dfs(s string, i, j int, dp [][]int) (res int) {	if j < i {		return	} else if 0 < dp[i][j] {		return dp[i][j]	}	res = dfs(s, i, j-1, dp) + 1	for k := i; k < j; k++ {		if s[k] == s[j] {			res = minInt(res, dfs(s, i, k, dp)+dfs(s, k+1, j-1, dp))		}	}	dp[i][j] = res	return}func minInt(x, y int) int {	if x < y {		return x	}	return y}
 |