題目連結:72. Edit Distance
解題思路#
看到兩字串比較的問題,會想到使用二維陣列 dp[i][j] 來記錄狀態。
dp[i][j] 表示子字串 s1 [0, i) 變成子字串 s2 [0, j) 最少需要操作的次數,因此當 word1[i-1] == word2[j-1] 時,代表不須對字串做任何操作,dp[i][j] 等於兩字串扣掉當前字元的答案,即 dp[i-1][j-1]。
當 word1[i-1] != word2[j-1] 時,會有三種情況:
- replace:將
word1[i]改成word2[j],dp[i][j]等於dp[i-1][j-1] + 1 - delate:將
word1[i]刪除,dp[i][j]等於dp[i-1][j] + 1 - insert:在
word1[i]後插入word2[j],dp[i][j]等於dp[i][j-1] + 1因此在這些操作中取最小值即可。
程式碼#
class Solution {
public:
int minDistance(string word1, string word2) {
int n = word1.size(), m = word2.size();
vector<vector<int>> dp(n + 1, vector<int>(m + 1, 0));
for (int i = 0; i <= n; i++)
dp[i][0] = i;
for (int i = 0; i <= m; i++)
dp[0][i] = i;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (word1[i-1] == word2[j-1])
dp[i][j] = dp[i-1][j-1];
else {
dp[i][j] = min(min(dp[i-1][j], dp[i][j-1]),
dp[i-1][j-1]) + 1;
}
}
}
return dp[n][m];
}
};