123456789101112131415161718192021222324252627282930313233343536373839 |
- func findRotateSteps(ring string, key string) int {
- // dp[i][j] means the min steps required to get the key[j] from ring[i],
- // then dp[0][0] is the answer.
- m, n := len(ring), len(key)
- if n == 0 {
- return 0
- }
- const INF int = 1e9
- dp := make([][]int, m)
- for i := range dp {
- dp[i] = make([]int, n+1)
- } // dp[i][j] = min(dp[i][j], dist(i, k) + dp[k][j+1])
- for j := n - 1; 0 <= j; j-- {
- for i := 0; i < m; i++ {
- dp[i][j] = INF
- for k := 0; k < m; k++ {
- if ring[k] == key[j] {
- step := minInt(abs(k-i), m-abs(k-i))
- dp[i][j] = minInt(dp[i][j], step+dp[k][j+1])
- }
- }
- }
- }
- return dp[0][0] + n
- }
- func abs(x int) int {
- if x < 0 {
- return -x
- }
- return x
- }
- func minInt(x, y int) int {
- if x < y {
- return x
- }
- return y
- }
|