Freedom Trail

HardStringDynamic ProgrammingDepth-First SearchBreadth-First Search

Solution

export function findRotateSteps(ring: string, key: string): number {
  const [m, n] = [ring.length, key.length];
 
  let prev = new Array(m).fill(0);
  for (let j = n - 1; 0 <= j; j--) {
    const curr = new Array(m).fill(Number.MAX_SAFE_INTEGER);
    for (let i = 0; i < m; i++) {
      for (let k = 0; k < m; k++) {
        if (ring[k] === key[j]) {
          const diff = Math.abs(i - k);
          const step = Math.min(diff, m - diff);
          curr[i] = Math.min(curr[i], step + prev[k] + 1);
        }
      }
    }
    prev = curr;
  }
 
  return prev[0];
}