題目連結: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];
}
};