Freedom Trail LeetCode solution in Python
1class Solution:2def findRotateSteps(self, ring: str, key: str) -> int:3locs = {}4for i, ch in enumerate(ring):5locs.setdefault(ch, []).append(i)67@cache8def fn(i, j):9"""Return turns to finish key[j:] startin from ith position on ring."""10if j == len(key):11return 012loc = locs[key[j]]13k = bisect_left(loc, i) % len(loc)14ans = min(abs(i - loc[k]), len(ring) - abs(i - loc[k])) + fn(loc[k], j + 1)15k = (k - 1) % len(loc)16ans = min(17ans,18min(abs(i - loc[k]), len(ring) - abs(i - loc[k])) + fn(loc[k], j + 1),19)20return ans2122return fn(0, 0) + len(key)