72. Edit Distance

ss
2 min readApr 16, 2021

--

這題dp寫起來非常容易, 但難點在於分析

我很喜歡看一個youtube教學, 他口齒非常清晰且也講得很明白

我們可以分成四種情況

第一種 不做任何事

A: "sabm" B: "sam"
因為最後一個都是"m"
所以我們相對只要查看
A: "sab" B: "sa" 的case
dp[i][j] = dp[i - 1][j - 1]

第二種 取代, replace

A: "sasb" B: "samc"
我們相對就是看他們扣除最後一個字元的字串
A: "sas" B: "sam"的case, 因為取代就是B的字串再加一個c
所以
dp[i][j] = dp[i-1][j-1] + 1

第三種 插入

A: "sam" B : "samc"
相對就是看
A: "sam" B: "sam" 然後 B在加 c
dp[i][j] = dp[i][j - 1] + 1

第四種 刪除

A: "sarc" B: "sam"

A: "sar" B: "sam" A扣除掉一個c後就會變這樣, 所以相當於這個sar, sam的結果在加1
dp[i][j] = dp[i - 1][j] + 1

因為要找的是最小改變的數量, 所以除了第一種case沒得選之外, 其他都直接取min就行了

class Solution {
public:
int minDistance(string word1, string word2) {
int m = word1.size();
int n = word2.size();
vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));
for(int j = 0; j <= n;j++){
dp[0][j] = j;
}
for(int i = 0; i <= m;i++){
dp[i][0] = i;
}
for(int i = 1; i <= m;i++){
for(int j = 1; j <= n;j++){
if(word1[i - 1] == word2[j - 1]){
dp[i][j] = dp[i -1][j - 1];
}else{
dp[i][j] = min({dp[i -1][j - 1], dp[i - 1][j] , dp[i][j-1]}) + 1;
}

}
}
return dp[m][n];
}
};

--

--

ss
ss

No responses yet