| 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
 
- }
 
 
  |