dengxinyi 6 gadi atpakaļ
vecāks
revīzija
39c7b2d478
1 mainītis faili ar 39 papildinājumiem un 0 dzēšanām
  1. 39 0
      hard/514.freedom-trail.go

+ 39 - 0
hard/514.freedom-trail.go

@@ -0,0 +1,39 @@
+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
+}