var minDistance = (word1, word2, i = 0, j = 0) => {
const isBaseCase1 = ((word1.length * word2.length) === 0);
if (isBaseCase1) return (word1.length + word2.length);
const isBaseCase2 = (word1.length === i);
if (isBaseCase2) return (word2.length - j);
const isBaseCase3 = (word2.length === j);
if (isBaseCase3) return (word1.length - i);
return dfs(word1, word2, i, j);
}
var dfs = (word1, word2, i, j) => {
const isEqual = (word1[i] === word2[j]);
if (isEqual) return minDistance(word1, word2, (i + 1), (j + 1));
const insert = minDistance(word1, word2, i, (j + 1));
const _delete = minDistance(word1, word2, (i + 1), j);
const replace = minDistance(word1, word2, (i + 1), (j + 1));
return (Math.min(insert, _delete, replace) + 1);
}
var minDistance = (word1, word2, i = 0, j = 0, memo = initMemo(word1, word2)) => {
const isBaseCase1 = ((word1.length * word2.length) === 0);
if (isBaseCase1) return (word1.length + word2.length);
const isBaseCase2 = (word1.length === i);
if (isBaseCase2) return (word2.length - j);
const isBaseCase3 = (word2.length === j);
if (isBaseCase3) return (word1.length - i);
const hasSeen = (memo[i][j] !== -1);
if (hasSeen) return memo[i][j];
return dfs(word1, word2, i, j, memo);
}
var initMemo = (word1, word2) => new Array(word1.length).fill()
.map(() => new Array(word2.length).fill(-1));
var dfs = (word1, word2, i, j, memo) => {
const isEqual = (word1[i] === word2[j]);
if (isEqual) {
memo[i][j] = minDistance(word1, word2, (i + 1), (j + 1), memo);
return memo[i][j];
}
const insert = minDistance(word1, word2, i, (j + 1), memo);
const _delete = minDistance(word1, word2, (i + 1), j, memo);
const replace = minDistance(word1, word2, (i + 1), (j + 1), memo);
memo[i][j] = (Math.min(insert, _delete, replace) + 1);
return memo[i][j];
}
var minDistance = (word1, word2) => {
const isEmpty = ((word1.length * word2.length) === 0);
if (isEmpty) return (word1.length + word2.length);
const tabu = initTabu(word1, word2);
search(word1, word2, tabu);
return tabu[word1.length][word2.length];
}
var initTabu = (word1, word2) => {
const tabu = new Array((word1.length + 1)).fill()
.map(() => new Array((word2.length + 1)).fill(0));
for (let i = 0; (i < (word1.length + 1)); i++) {
tabu[i][0] = i;
}
for (let j = 0; (j < (word2.length + 1)); j++) {
tabu[0][j] = j;
}
return tabu;
}
var search = (word1, word2, tabu) => {
for (let i = 1; (i < (word1.length + 1)); i++) {
for (let j = 1; (j < (word2.length + 1)); j++) {
const left = (tabu[(i - 1)][j] + 1);
const down = (tabu[i][(j - 1)] + 1);
const isEqual = (word1[(i - 1)] === word2[(j - 1)]);
const leftDown = (tabu[(i - 1)][(j - 1)] + Number(!isEqual));
tabu[i][j] = Math.min(left, down, leftDown);
}
}
}
var minDistance = (word1, word2) => {
const tabu = initTabu(word2);
search(word1, word2, tabu);
return tabu[word2.length];
}
var initTabu = (word2) => {
const tabu = new Array((word2.length + 1)).fill(0);
for (let j = 1; (j <= word2.length); j++) {
tabu[j] = j;
}
return tabu;
}
var search = (word1, word2, tabu) => {
for (let i = 1; (i <= word1.length); i++) {
tabu[word2.length] = update(word1, word2, i, tabu);
}
}
const update = (word1, word2, i, tabu) => {
let temp = i;
for (let j = 1; (j <= word2.length); ++j) {
const isEqual = (word1[(i - 1)] === word2[(j - 1)])
const cur = isEqual
? tabu[(j - 1)]
: (Math.min(tabu[(j - 1)], tabu[j], temp) + 1);
tabu[(j - 1)] = temp;
temp = cur;
}
return temp;
}