72. Edit Distance - Medium
前往題目
思路
- 二維
dp
,分別是i
和j
,word1
與word2
的指針 i, j
代表取word1
和word2
的前i
和前j
個- 如此一來,
base case
就是word1
取了前幾個,word2
取0
個,那每次都會等於i
;相同的,word1
取0
個,word2
取了前幾個,每次都等於j
- 從左到右一個一個看,當前的字母都一樣的話那代表什麼都不用做,所以就等於上次(
i - 1, j - 1
)的操作數 - 如果不一樣,有三種操作
也是腦筋急轉彎的一題
Code
class Solution {
public int minDistance(String word1, String word2) {
final int m = word1.length();
final int n = word2.length();
int[][] dp = new int[m + 1][n + 1];
// For easier pointer operation
word1 = "#" + word1;
word2 = "#" + word2;
// Base case
for (int i = 0; i <= m; ++i) {
// 加入i個相應字符
dp[i][0] = i;
}
for (int j = 0; j <= n; ++j) {
// 加入j個相應字符
dp[0][j] = j;
}
// 因為0, 0是base case所以從1開始
for (int i = 1; i <= m; ++i) {
for (int j = 1; j <= n; ++j) {
// 遇到相同字符,那就無需任何操作,直接等於上次的
if (word1.charAt(i) == word2.charAt(j)) {
dp[i][j] = dp[i - 1][j - 1];
} else {
// +1是因為操作了一次
dp[i][j] = Math.min(dp[i - 1][j - 1] + 1, // 替換
Math.min(dp[i - 1][j] + 1, // 刪除
dp[i][j - 1] + 1)); // 插入
}
}
}
return dp[m][n]; // 兩個指針都抵達終點的操作數
}
}
72. Edit Distance - Medium
https://f88083.github.io/2024/03/07/72-Edit-Distance-Medium/