class Solution {
public int minDistance(String word1, String word2) {
int n = word1.length();
int m = word2.length();
// 有一个字符串为空串
if (n * m == 0) {
return n + m;
}
// DP 数组
int[][] D = new int[n + 1][m + 1];
// 边界状态初始化
for (int i = 0; i < n + 1; i++) {
D[i][0] = i;
}
for (int j = 0; j < m + 1; j++) {
D[0][j] = j;
}
// 计算所有 DP 值
for (int i = 1; i < n + 1; i++) {
for (int j = 1; j < m + 1; j++) {
int left = D[i - 1][j] + 1;
int down = D[i][j - 1] + 1;
int left_down = D[i - 1][j - 1];
if (word1.charAt(i - 1) != word2.charAt(j - 1)) {
left_down += 1;
}
D[i][j] = Math.min(left, Math.min(down, left_down));
}
}
return D[n][m];
}
}
class Solution:
def minDistance(self, word1: str, word2: str) -> int:
m, n = len(word1), len(word2)
dp = [[-1] * (n + 1) for _ in range(m + 1)]
def dp_dist(i, j):
if dp[i][j] >= 0:
return dp[i][j]
if i * j == 0:
dp[i][j] = i + j
elif word1[i - 1] == word2[j - 1]:
dp[i][j] = dp_dist(i - 1, j - 1)
else:
dp[i][j] = 1 + min(dp_dist(i - 1, j), dp_dist(i, j - 1), dp_dist(i - 1, j - 1))
return dp[i][j]
return dp_dist(m, n)
class Solution {
public:
int minDistance(string word1, string word2) {
int n = word1.size(), m = word2.size();
word1 = ' ' + word1; //添加空格
word2 = ' ' + word2;
vector<vector<int>>f(n + 1, vector<int>(m + 1));
for(int i = 0; i <= n; i++) f[i][0] = i; //i次删除
for(int i = 0; i <= m; i++) f[0][i] = i; //i次删除 word1 -> word2
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++){
f[i][j] = min(f[i - 1][j], f[i][j - 1]) + 1; //添加或者删除
if(word1[i] == word2[j]) f[i][j] = min(f[i][j], f[i - 1][j - 1]);
else f[i][j] = min(f[i][j], f[i - 1][j - 1] + 1); //替换
}
return f[n][m];
}
};