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


  • 題目:
    給定兩個字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];
        }
    };

     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM