leetcode 72. 編輯距離
阿新 • • 發佈:2021-01-28
72. 編輯距離
給你兩個單詞 word1 和 word2,請你計算出將 word1 轉換成 word2 所使用的最少運算元 。
你可以對一個單詞進行如下三種操作:
插入一個字元
刪除一個字元
替換一個字元
示例 1:
輸入:word1 = “horse”, word2 = “ros”
輸出:3
解釋:
horse -> rorse (將 ‘h’ 替換為 ‘r’)
rorse -> rose (刪除 ‘r’)
rose -> ros (刪除 ‘e’)
示例 2:
輸入:word1 = “intention”, word2 = “execution”
解釋:
intention -> inention (刪除 ‘t’)
inention -> enention (將 ‘i’ 替換為 ‘e’)
enention -> exention (將 ‘n’ 替換為 ‘x’)
exention -> exection (將 ‘n’ 替換為 ‘c’)
exection -> execution (插入 ‘u’)
解題思路:( 參考這位大佬)
// dp[i][j] 代表 word1 到 i 位置轉換成 word2 到 j 位置需要最少步數
// 當 word1[i] == word2[j],dp[i][j] = dp[i-1][j-1];
// 其中,dp[i-1][j-1] 表示替換操作,dp[i-1][j] 表示刪除操作,dp[i][j-1] 表示插入操作。
// 第一行,是 word1 為空變成 word2 最少步數,就是插入操作
// 第一列,是 word2 為空,需要的最少步數,就是刪除操作
class Solution {
public:
int minDistance(string word1, string word2) {
int m = word1.size(), n = word2.size();
vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));
for(int i = 0; i <= m; i++) dp[i][0] = i; //Word1為空,插入需要多少步
for(int i = 0; i <= n; i++) dp[0][i] = i; //word2為空,刪除需要多少步
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] = 1 + min(dp[i - 1][j], min(dp[i][j - 1], dp[i - 1][j - 1]));
}
}
return dp[m][n];
}
};