Leetcode---72. 編輯距離---記憶化DFS

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);
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章