1. 程式人生 > 其它 >LeetCode/編輯距離

LeetCode/編輯距離

給你兩個單詞 word1 和 word2, 請返回將 word1 轉換成 word2 所使用的最少運算元  。

你可以對一個單詞進行如下三種操作:

插入一個字元
刪除一個字元
替換一個字元

對於最優問題計算,考慮用動態規劃,這裡dp[i][j]設為
為word1前i個字元和word2前j個字元的最少運算元

隨著往後遍歷,需要考慮的字串長度增加,分別需要考慮由增添、刪除、修改三種方式轉移過來的狀態,取最小值
增,dp[i][j] = dp[i][j - 1] + 1
刪,dp[i][j] = dp[i - 1][j] + 1
改,dp[i][j] = dp[i - 1][j - 1] + 1

class Solution {
public:
    int minDistance(string word1, string word2) {
        //最優問題使用動態規劃,設dp[i][j]為word1前i個字元和word2前j個字元的最少運算元
        //接著考慮狀態轉移方程和邊界條件
        //顯然dp[0][j]=j,dp[i][0]=i
        //dp[i][j]
        int n = word1.size();
        int m = word2.size();
        // 有一個字串為空串
        if (n * m == 0) return n + m;
        // DP 陣列
        vector<vector<int>> D(n + 1, vector<int>(m + 1));
        // 邊界狀態初始化
        for (int i = 0; i < n + 1; i++) 
            D[i][0] = i;
        for (int j = 0; j < m + 1; j++) 
            D[0][j] = j;
        // 計算所有 DP 值
        for (int i = 1; i < n + 1; i++) {
            for (int j = 1; j < m + 1; j++) {
                int left = D[i - 1][j] + 1;
                int down = D[i][j - 1] + 1;//
                int left_down = D[i - 1][j - 1];
                if (word1[i - 1] != word2[j - 1]) left_down += 1;//不相等需要替換
                D[i][j] = min(left, min(down, left_down));

            }
        }
        return D[n][m];
    }
};