(字串動態規劃)一個字串變成另一個字串的步驟數

Kobe10發表於2017-02-04
  • 題目:
    給定兩個字word1和word2,找到將word1轉換為word2所需的最小步驟數。 (每個操作計為1步)。
    
    您對單詞允許以下3種操作:
    
    a)插入字元
    b)刪除字元
    c)替換字元

     

  • 思路:

    dp[i][j]指把word1[0..i - 1]轉換為word2[0..j - 1] 的最小運算元。

    邊界條件:

    dp[i][0] = i; 從長度為 i 的字串轉為空串 要刪除 i 次
    dp[0][j] = j. 從空串轉為長度為 j 的字串 要新增 j 次

    一般情況:

    如果word[i - 1] == word2[j - 1],則dp[i][j] = dp[i - 1][j - 1],因為不需要進行操作,即運算元為0.

    如果word[i - 1] != word2[j - 1],則需考慮三種情況,取最小值:

    Replace word1[i - 1] by word2[j - 1]: (dp[i][j] = dp[i - 1][j - 1] + 1 (for replacement));
    Delete word1[i - 1]:                             (dp[i][j] = dp[i - 1][j] + 1 (for deletion));
    Insert word2[j - 1] to word1[0..i - 1]:   (dp[i][j] = dp[i][j - 1] + 1 (for insertion)).



  • 程式碼
    class Solution {
    public:
        int minDistance(string word1, string word2) {
            int row = word1.size();
            int col = word2.size();
            vector<vector<int> >dp(row+1, vector<int>(col+1, 0));
            
            for (int i=1; i<=row; i++)
                dp[i][0] = i;//從長度為i的字串到空串需要變換i次
            for (int j=1; j<=col; j++)
                dp[0][j] = j;//從長度為kong的字串到長度為j的字串需要變換j次
            
            for (int i=1; i<=row; i++){
                for (int j=1; j<=col; j++){
                    if (word1[i-1] == word2[j-1])
                        dp[i][j] = dp[i-1][j-1];
                    else
                        dp[i][j] = min(min(dp[i-1][j-1]+1,dp[i-1][j] +1), dp[i][j-1]+1 );
                }
            }
            return dp[row][col];
        }
    };

     

相關文章