class Solution:
def minDistance(self, word1: str, word2: str) -> int:
m, n = len(word1), len(word2)
dp = {}
def dfs(i, j):
if i == m:
return n - j
if j == n:
return m - i
if (i, j) in dp:
return dp[(i, j)]
if word1[i] == word2[j]:
dp[(i, j)] = dfs(i + 1, j + 1)
else:
res = min(dfs(i + 1, j), dfs(i, j + 1))
res = min(res, dfs(i + 1, j + 1))
dp[(i, j)] = res + 1
return dp[(i, j)]
return dfs(0, 0)
public class Solution {
private int[][] dp;
public int minDistance(String word1, String word2) {
int m = word1.length(), n = word2.length();
dp = new int[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
dp[i][j] = -1;
}
}
return dfs(0, 0, word1, word2, m, n);
}
private int dfs(int i, int j, String word1, String word2, int m, int n) {
if (i == m) return n - j;
if (j == n) return m - i;
if (dp[i][j] != -1) return dp[i][j];
if (word1.charAt(i) == word2.charAt(j)) {
dp[i][j] = dfs(i + 1, j + 1, word1, word2, m, n);
} else {
int res = Math.min(dfs(i + 1, j, word1, word2, m, n),
dfs(i, j + 1, word1, word2, m, n));
res = Math.min(res, dfs(i + 1, j + 1, word1, word2, m, n));
dp[i][j] = res + 1;
}
return dp[i][j];
}
}
class Solution {
vector> dp;
public:
int minDistance(string word1, string word2) {
int m = word1.size(), n = word2.size();
dp = vector>(m, vector(n, -1));
return dfs(0, 0, word1, word2, m, n);
}
int dfs(int i, int j, string& word1, string& word2, int m, int n) {
if (i == m) return n - j;
if (j == n) return m - i;
if (dp[i][j] != -1) return dp[i][j];
if (word1[i] == word2[j]){
dp[i][j] = dfs(i + 1, j + 1, word1, word2, m, n);
} else {
int res = min(dfs(i + 1, j, word1, word2, m, n),
dfs(i, j + 1, word1, word2, m, n));
res = min(res, dfs(i + 1, j + 1, word1, word2, m, n));
dp[i][j] = res + 1;
}
return dp[i][j];
}
};
class Solution {
/**
* @param {string} word1
* @param {string} word2
* @return {number}
*/
minDistance(word1, word2) {
const m = word1.length, n = word2.length;
let dp = Array.from({ length: m + 1 }, () =>
Array(n + 1).fill(-1));
const dfs = (i, j) => {
if (i === m) return n - j;
if (j === n) return m - i;
if (dp[i][j] != -1) return dp[i][j];
if (word1[i] === word2[j]) {
dp[i][j] = dfs(i + 1, j + 1);
} else {
let res = Math.min(dfs(i + 1, j), dfs(i, j + 1));
res = Math.min(res, dfs(i + 1, j + 1));
dp[i][j] = res + 1;
}
return dp[i][j];
};
return dfs(0, 0);
}
}