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"
輸出:5
解釋:
intention -> inention (刪除 't')
inention -> enention (將 'i' 替換爲 'e')
enention -> exention (將 'n' 替換爲 'x')
exention -> exection (將 'n' 替換爲 'c')
exection -> execution (插入 'u')
實現代碼
class Solution {
public:
string str1, str2;
int len1, len2;
vector<vector<int>> dp;
int dfs(int i, int j) {
if (i == len1) return len2 - j; // 插入後面全部
if (j == len2) return len1 - i; // 刪除後面全部
if (dp[i][j]) return dp[i][j];
// 如果是相同字符,那麼等於此步不用操作(+0)且定位器同時後移一位
if (str1[i] == str2[j]) return dp[i][j] = dfs(i + 1, j + 1);
// 分別是刪除, 插入,替換三種情況
return dp[i][j] = min(dfs(i + 1, j), min(dfs(i, j + 1), dfs(i + 1, j + 1))) + 1;
}
int minDistance(string word1, string word2) {
str1 = word1, str2 = word2;
len1 = str1.length(), len2 = str2.length();
dp = vector<vector<int>>(len1, vector<int>(len2, 0)); // 初始化記錄本
return dfs(0, 0);
}
};