1. 程式人生 > 其它 >leetcode 72. 編輯距離

leetcode 72. 編輯距離

技術標籤:c++演算法

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’)

解題思路:參考這位大佬
// dp[i][j] 代表 word1 到 i 位置轉換成 word2 到 j 位置需要最少步數
// 當 word1[i] == word2[j],dp[i][j] = dp[i-1][j-1];

// 當 word1[i] != word2[j],dp[i][j] = min(dp[i-1][j-1], dp[i-1][j], dp[i][j-1]) + 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]; } };