
https://leetcode-cn.com/problems/freedom-trail/
别的不说,就比如在前往 key[i] 时,逆时针和顺时针波动以到达的一个最近位置的花费是一样的,dp 如何表达这件事?
dfs 用过了,超时。。。
import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; public class Solution { private String rring; private String kkey; private Map<Character, Set<Integer>> ringMap; private int ans = Integer.MAX_VALUE; public int findRotateSteps(String ring, String key) { rring = ring; kkey = key; ringMap = new HashMap<>(); for (int i = 0; i < ring.length(); i++) { char c = ring.charAt(i); Set<Integer> set = ringMap.getOrDefault(c, new HashSet<Integer>()); set.add(i); ringMap.put(c, set); } dfs(0, 0, 0); return ans; } public void dfs(int keyIdx, int nowIdx, int stepCounter) { if (keyIdx == kkey.length()) { ans = Math.min(ans, stepCounter); return; } Character ch = kkey.charAt(keyIdx); for (Integer nextIdx : ringMap.get(ch)) { dfs(keyIdx + 1, nextIdx, stepCounter + 1 + distanceCounter(nowIdx, nextIdx)); } } public int distanceCounter(int nowIdx, int nextIdx) { int a = Math.abs(nextIdx - nowIdx); int b = rring.length() - a; return Math.min(a, b); } } 谢谢