72. Edit Distance

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class Solution {
public int minDistance(String word1, String word2) {
int m = word1.length(), n = word2.length();

// 定义 dp[i][j] 为 word1 前 i 个字符转换成 word2 前 j 个字符所使用的最少操作数
int[][] dp = new int[m + 1][n + 1];
dp[0][0] = 0;
for (int i = 1; i <= m; i++) {
dp[i][0] = i;
}
for (int j = 1; j <= n; j++) {
dp[0][j] = j;
}

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][j] = Math.min(Math.min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;
}
}
}

return dp[m][n];
}
}

dp[i][j] 对应的 word1 进行插入操作即得到 dp[i + 1][j],且因为插入的字符为 word2[j],所以抵消最后一个字符后 dp[i + 1][j] 等于 dp[i][j - 1]。对 dp[i][j] 对应的 word1 进行删除操作即得到 dp[i - 1][j]。对 dp[i][j] 对应的 word1word2 进行替换操作即得到 dp[i - 1][j - 1]

References

72. Edit Distance