664.strange-printer.go 721 B

1234567891011121314151617181920212223242526272829303132333435
  1. func strangePrinter(s string) int {
  2. n := len(s)
  3. dp := make([][]int, n)
  4. for i := range dp {
  5. dp[i] = make([]int, n)
  6. }
  7. // dp[i][j] means the min move to build string s[i:j+1].
  8. // So, dp[i][j] = 0, j < i (empty string)
  9. // = dp[i][j-1] + 1 (init)
  10. // = min(dp[i][j], dp[i][k]+dp[k+1][j-1]), s[k] == s[j]
  11. return dfs(s, 0, n-1, dp)
  12. }
  13. func dfs(s string, i, j int, dp [][]int) (res int) {
  14. if j < i {
  15. return
  16. } else if 0 < dp[i][j] {
  17. return dp[i][j]
  18. }
  19. res = dfs(s, i, j-1, dp) + 1
  20. for k := i; k < j; k++ {
  21. if s[k] == s[j] {
  22. res = minInt(res, dfs(s, i, k, dp)+dfs(s, k+1, j-1, dp))
  23. }
  24. }
  25. dp[i][j] = res
  26. return
  27. }
  28. func minInt(x, y int) int {
  29. if x < y {
  30. return x
  31. }
  32. return y
  33. }