Given two strings s1 and s2 of lengths m and n, find the minimum number of edits (operations) to convert "s1" into "s2" using operations of insert, remove or replace of a char.
This algorithm uses memoization to improve performance. It's same as the recursive version of Find the minimum number of edits, but with a special 'cache' to store results. The 'cache key' is crucial. It's how we identify and store past results. Sometimes we need one key, sometimes multiple keys. We add code to:
cache = None def count(s1, s2, i, j): if len(s1) <= 0: return len(s2) if len(s2) <= 0: return len(s1) global cache if not cache: cache = [[None] * len(s2) for _ in range(len(s1))] if not cache[i][j]: mn = 0 if s1[0] == s2[0]: mn = count(s1[1:], s2[1:], i + 1, j + 1) else: mn = 1 + min(count(s1, s2[1:], i, j + 1), count(s1[1:], s2, i + 1, j), count(s1[1:], s2[1:], i + 1, j + 1)) cache[i][j] = mn return cache[i][j] s1 = 'sunday' s2 = 'saturday' print(count(s1, s2, 0, 0))
let cache = null; function count(s1, s2, i, j) { if (s1.length <= 0) { return s2.length; } if (s2.length <= 0) { return s1.length; } if (!cache) { cache = Array.from(Array(s1.length), () => Array(s2.length).fill(null)); } if (!cache[i][j]) { let min = 0; if (s1.at(0) === s2.at(0)) { min = count(s1.slice(1), s2.slice(1), i + 1, j + 1); } else { min = 1 + Math.min( count(s1, s2.slice(1), i, j + 1), count(s1.slice(1), s2, i + 1, j), count(s1.slice(1), s2.slice(1), i + 1, j + 1) ); } cache[i][j] = min; } return cache[i][j]; } const s1 = 'sunday'; const s2 = 'saturday'; console.log(count(s1, s2, 0, 0));