514.freedom-trail.go 757 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. func findRotateSteps(ring string, key string) int {
  2. // dp[i][j] means the min steps required to get the key[j] from ring[i],
  3. // then dp[0][0] is the answer.
  4. m, n := len(ring), len(key)
  5. if n == 0 {
  6. return 0
  7. }
  8. const INF int = 1e9
  9. dp := make([][]int, m)
  10. for i := range dp {
  11. dp[i] = make([]int, n+1)
  12. } // dp[i][j] = min(dp[i][j], dist(i, k) + dp[k][j+1])
  13. for j := n - 1; 0 <= j; j-- {
  14. for i := 0; i < m; i++ {
  15. dp[i][j] = INF
  16. for k := 0; k < m; k++ {
  17. if ring[k] == key[j] {
  18. step := minInt(abs(k-i), m-abs(k-i))
  19. dp[i][j] = minInt(dp[i][j], step+dp[k][j+1])
  20. }
  21. }
  22. }
  23. }
  24. return dp[0][0] + n
  25. }
  26. func abs(x int) int {
  27. if x < 0 {
  28. return -x
  29. }
  30. return x
  31. }
  32. func minInt(x, y int) int {
  33. if x < y {
  34. return x
  35. }
  36. return y
  37. }