class Solution {
public int minDistance(String word1, String word2) {
int m = word1.length();
int n = word2.length();
// dp[i][j] 即将 word1 的前 i 个字符转换为 word2 的前 j 个字符所需的最小步骤
// dp[][] table 存储避免重叠子问题
int[][] dp = new int[m + 1][n + 1];
// base case
// word1 为空或 Word2 为空
for (int i = 1; i <= m; i++) {
dp[i][0] = i;
}
for (int j = 1; j <= n; j++) {
dp[0][j] = j;
}
// 自底向上 避免下标越界 下标统一 + 1
// for (int i = 1; i <= m; i++) {
// for (int j = 1; j <= n; j++) {
// if (word1.charAt(i - 1) == word2.charAt(j - 1)) {
// dp[i][j] = dp[i - 1][j - 1];
// } else {
// // dp[i - 1][j] + 1 即 word1 做删除操作
// // dp[i][j - 1] + 1 即 word1 做插入操作
// // dp[i - 1][j - 1] + 1 即 word1 做替换操作
// dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i - 1][j - 1] + 1);
// }
// }
// }
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
// 状态转移
if (word1.charAt(i) == word2.charAt(j)) {
dp[i + 1][j + 1] = dp[i][j];
} else {
// 操作都基于 word1
// dp[i][j + 1] 即 word1 做删除操作
// dp[i + 1][j] 即 word1 做插入操作
// dp[i][j] 即 word1 做替换操作
dp[i + 1][j + 1] = 1 + min(dp[i][j + 1], dp[i + 1][j], dp[i][j]);
}
}
}
// word1 前 m 个字符即整个word1 和 word2前 n 个字符即整个 word2 的最小编辑距离
return dp[m][n];
}
int min(int a, int b, int c) {
return Math.min(a, Math.min(b, c));
}
}
08-22
63
10-08
351
“相关推荐”对你有帮助么?
-
非常没帮助
-
没帮助
-
一般
-
有帮助
-
非常有帮助
提交