int minDistance(string word1, string word2) {
function<int(int, int)> dist = [&](int i, int j) -> int {
if (i == (int)word1.size()) return (int)word2.size() - j;
if (j == (int)word2.size()) return (int)word1.size() - i;
if (word1[i] == word2[j]) return dist(i + 1, j + 1);
return 1 + min({dist(i + 1, j + 1), dist(i + 1, j), dist(i, j + 1)});
};
return dist(0, 0);
}
public int minDistance(String word1, String word2) {
return dist(word1, word2, 0, 0);
}
private int dist(String word1, String word2, int i, int j) {
if (i == word1.length()) return word2.length() - j;
if (j == word2.length()) return word1.length() - i;
if (word1.charAt(i) == word2.charAt(j)) return dist(word1, word2, i + 1, j + 1);
return 1 + Math.min(dist(word1, word2, i + 1, j + 1), Math.min(dist(word1, word2, i + 1, j), dist(word1, word2, i, j + 1)));
}
def min_distance(word1, word2):
def dist(i, j):
if i == len(word1): return len(word2) - j
if j == len(word2): return len(word1) - i
if word1[i] == word2[j]: return dist(i + 1, j + 1)
return 1 + min(dist(i + 1, j + 1), dist(i + 1, j), dist(i, j + 1))
return dist(0, 0)
function minDistance(word1: string, word2: string): number {
const dist = (i: number, j: number): number => {
if (i === word1.length) return word2.length - j;
if (j === word2.length) return word1.length - i;
if (word1[i] === word2[j]) return dist(i + 1, j + 1);
return 1 + Math.min(dist(i + 1, j + 1), dist(i + 1, j), dist(i, j + 1));
};
return dist(0, 0);
}
int minDistance(string word1, string word2) {
vector<vector<int>> memo(word1.size(), vector<int>(word2.size(), -1));
function<int(int, int)> dist = [&](int i, int j) -> int {
if (i == (int)word1.size()) return (int)word2.size() - j;
if (j == (int)word2.size()) return (int)word1.size() - i;
if (memo[i][j] != -1) return memo[i][j];
int result;
if (word1[i] == word2[j]) result = dist(i + 1, j + 1);
else result = 1 + min({dist(i + 1, j + 1), dist(i + 1, j), dist(i, j + 1)});
memo[i][j] = result;
return result;
};
return dist(0, 0);
}
public int minDistance(String word1, String word2) {
int[][] memo = new int[word1.length()][word2.length()];
for (int[] row : memo) Arrays.fill(row, -1);
return dist(word1, word2, memo, 0, 0);
}
private int dist(String word1, String word2, int[][] memo, int i, int j) {
if (i == word1.length()) return word2.length() - j;
if (j == word2.length()) return word1.length() - i;
if (memo[i][j] != -1) return memo[i][j];
int result;
if (word1.charAt(i) == word2.charAt(j)) result = dist(word1, word2, memo, i + 1, j + 1);
else result = 1 + Math.min(dist(word1, word2, memo, i + 1, j + 1), Math.min(dist(word1, word2, memo, i + 1, j), dist(word1, word2, memo, i, j + 1)));
memo[i][j] = result;
return result;
}
def min_distance(word1, word2):
memo = [[-1] * len(word2) for _ in range(len(word1))]
def dist(i, j):
if i == len(word1): return len(word2) - j
if j == len(word2): return len(word1) - i
if memo[i][j] != -1: return memo[i][j]
if word1[i] == word2[j]: result = dist(i + 1, j + 1)
else: result = 1 + min(dist(i + 1, j + 1), dist(i + 1, j), dist(i, j + 1))
memo[i][j] = result
return result
return dist(0, 0)
function minDistance(word1: string, word2: string): number {
const memo = Array.from({ length: word1.length }, () => new Array<number>(word2.length).fill(-1));
const dist = (i: number, j: number): number => {
if (i === word1.length) return word2.length - j;
if (j === word2.length) return word1.length - i;
if (memo[i][j] !== -1) return memo[i][j];
let result: number;
if (word1[i] === word2[j]) result = dist(i + 1, j + 1);
else result = 1 + Math.min(dist(i + 1, j + 1), dist(i + 1, j), dist(i, j + 1));
memo[i][j] = result;
return result;
};
return dist(0, 0);
}
int minDistance(string word1, string word2) {
int m = word1.size(), n = word2.size();
vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));
for (int i = m; i >= 0; i--) {
for (int j = n; j >= 0; j--) {
if (i == m) dp[i][j] = n - j;
else if (j == n) dp[i][j] = m - i;
else if (word1[i] == word2[j]) dp[i][j] = dp[i + 1][j + 1];
else dp[i][j] = 1 + min({dp[i + 1][j + 1], dp[i + 1][j], dp[i][j + 1]});
}
}
return dp[0][0];
}
public int minDistance(String word1, String word2) {
int m = word1.length(), n = word2.length();
int[][] dp = new int[m + 1][n + 1];
for (int i = m; i >= 0; i--) {
for (int j = n; j >= 0; j--) {
if (i == m) dp[i][j] = n - j;
else if (j == n) dp[i][j] = m - i;
else if (word1.charAt(i) == word2.charAt(j)) dp[i][j] = dp[i + 1][j + 1];
else dp[i][j] = 1 + Math.min(dp[i + 1][j + 1], Math.min(dp[i + 1][j], dp[i][j + 1]));
}
}
return dp[0][0];
}
def min_distance(word1, word2):
m, n = len(word1), len(word2)
dp = [[0] * (n + 1) for _ in range(m + 1)]
for i in range(m, -1, -1):
for j in range(n, -1, -1):
if i == m: dp[i][j] = n - j
elif j == n: dp[i][j] = m - i
elif word1[i] == word2[j]: dp[i][j] = dp[i + 1][j + 1]
else: dp[i][j] = 1 + min(dp[i + 1][j + 1], dp[i + 1][j], dp[i][j + 1])
return dp[0][0]
function minDistance(word1: string, word2: string): number {
const m = word1.length, n = word2.length;
const dp = Array.from({ length: m + 1 }, () => new Array<number>(n + 1).fill(0));
for (let i = m; i >= 0; i--) {
for (let j = n; j >= 0; j--) {
if (i === m) dp[i][j] = n - j;
else if (j === n) dp[i][j] = m - i;
else if (word1[i] === word2[j]) dp[i][j] = dp[i + 1][j + 1];
else dp[i][j] = 1 + Math.min(dp[i + 1][j + 1], dp[i + 1][j], dp[i][j + 1]);
}
}
return dp[0][0];
}
int minDistance(string word1, string word2) {
if (word1.size() < word2.size()) swap(word1, word2);
int m = word1.size(), n = word2.size();
vector<int> row(n + 1);
for (int j = 0; j <= n; j++) row[j] = n - j;
for (int i = m - 1; i >= 0; i--) {
int diag = row[n];
row[n] = m - i;
for (int j = n - 1; j >= 0; j--) {
int saved = row[j];
row[j] = word1[i] == word2[j] ? diag : 1 + min({diag, saved, row[j + 1]});
diag = saved;
}
}
return row[0];
}
public int minDistance(String word1, String word2) {
if (word1.length() < word2.length()) { String t = word1; word1 = word2; word2 = t; }
int m = word1.length(), n = word2.length();
int[] row = new int[n + 1];
for (int j = 0; j <= n; j++) row[j] = n - j;
for (int i = m - 1; i >= 0; i--) {
int diag = row[n];
row[n] = m - i;
for (int j = n - 1; j >= 0; j--) {
int saved = row[j];
row[j] = word1.charAt(i) == word2.charAt(j) ? diag : 1 + Math.min(diag, Math.min(saved, row[j + 1]));
diag = saved;
}
}
return row[0];
}
def min_distance(word1, word2):
if len(word1) < len(word2): word1, word2 = word2, word1
m, n = len(word1), len(word2)
row = [n - j for j in range(n + 1)]
for i in range(m - 1, -1, -1):
diag = row[n]
row[n] = m - i
for j in range(n - 1, -1, -1):
saved = row[j]
row[j] = diag if word1[i] == word2[j] else 1 + min(diag, saved, row[j + 1])
diag = saved
return row[0]
function minDistance(word1: string, word2: string): number {
if (word1.length < word2.length) [word1, word2] = [word2, word1];
const m = word1.length, n = word2.length;
const row = Array.from({ length: n + 1 }, (_, j) => n - j);
for (let i = m - 1; i >= 0; i--) {
let diag = row[n];
row[n] = m - i;
for (let j = n - 1; j >= 0; j--) {
const saved = row[j];
row[j] = word1[i] === word2[j] ? diag : 1 + Math.min(diag, saved, row[j + 1]);
diag = saved;
}
}
return row[0];
}