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