LeetCode/編輯距離
阿新 • • 發佈:2022-05-26
給你兩個單詞 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]; } };