LeetCode72. Edit Distance 動態規劃 C++實現

LeetCode72. Edit Distance 動態規劃 C++實現

題目鏈接

Edit Distance

題目大意

給定兩個字符串word1word2,求最短編輯距離,即通過增刪改操作能夠使得兩個字符串變成一個字符串的最少步驟的步數

算法思路

根據題意,基於動態規劃的思想,dp[i][j]爲子串word1[0...i]與子串word2[0...j]的編輯距離,初始化,第一行,dp[0][i] = i;,第一列,dp[i][0] = i,因爲,對於第一行,此時的word1的子串爲空串,和word2的子串的距離爲word1增加字符的個數,而對於第一列,此時的word2爲空串,則word1word2的距離即爲word1刪除的字符個數,動態轉移方程爲dp[i][j] = (word1[i - 1] == word2[j - 1] ? dp[i - 1][j - 1] : 1 + min(dp[i - 1][j - 1], min(dp[i - 1][j], dp[i][j - 1])));,即考慮兩種情況

  • word1的第i個字符和word2j個字符相等,則無需操作,dp[i][j] = dp[i - 1][j - 1];
  • word1的第i個字符和word2j個字符不相等,可以有三種選擇,分別爲刪除一個word1字符、增加一個word1字符和替換一個word1字符,即基於已完成操作步驟數dp[i - 1][j]刪除word1一個字符或增加word2一個字符基於已完成操作步驟數dp[i][j - 1]增加word1一個字符或刪除word2一個字符和基於已完成操作步驟數dp[i - 1][j - 1]替換word1word2一個字符,增刪改的步驟數都爲1,動態轉移方程選取最小的一個加上步驟數1

最後返回dp[word1.length()][word2.length()]即可

AC代碼

class Solution {
public:
    int minDistance(string word1, string word2) {
        vector<vector<int> > dp(word1.length() + 1, vector<int> (word2.length() + 1, 0));
        for (int i = 0; i < dp.size(); i++) {
            dp[i][0] = i;
        }
        for (int i = 0; i < dp[0].size(); i++) {
            dp[0][i] = i;
        }
        for (int i = 1; i < dp.size(); i++) {
            for (int j = 1; j < dp[i].size(); j++) {
                dp[i][j] = (word1[i - 1] == word2[j - 1] ? dp[i - 1][j - 1] :  1 + min(dp[i - 1][j - 1], min(dp[i - 1][j], dp[i][j - 1])));
            }
        }
        return dp[word1.length()][word2.length()];
    }
};

樣例輸入1

horse
ros

樣例輸出1

3

樣例輸入2

intention
execution

樣例輸出2

5

鳴謝

LeetCode

最後

  • 由於博主水平有限,不免有疏漏之處,歡迎讀者隨時批評指正,以免造成不必要的誤解!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章