https://leetcode.com/problems/freedom-trail/
public class Solution { // dp[i][j] - min cost for spelling key.substring(j, key.length), when i-th character of the ring is at 12 o clock // dp[i][j] = Min(dp[k][j + 1] + distance(i, k)), if ring[k] == key[j] // dp[i][key.length] = 0, 0 <= i <= ring.length // result: dp[0][0] public int findRotateSteps(String ring, String key) { int[][] dp = new int[ring.length()][key.length() + 1]; for (int j = key.length() - 1; j >= 0; j--) { for (int i = 0; i < ring.length(); i++) { dp[i][j] = Integer.MAX_VALUE; for (int k = 0; k < ring.length(); k++) { if (ring.charAt(k) == key.charAt(j)) { int distance = Math.abs(i - k); int step = Math.min(distance, ring.length() - distance); dp[i][j] = Math.min(dp[i][j], step + dp[k][j + 1]); } } } } return dp[0][0] + key.length(); } }