1. 程式人生 > >[LeeCode] Edit Distance解法

[LeeCode] Edit Distance解法

題目

Given two words word1 and word2, find the minimum number of operations required to convert word1 to word2.

You have the following 3 operations permitted on a word:

  1. Insert a character
  2. Delete a character
  3. Replace a charactetr

具體的例子看原題描述吧。

分析

其實這道題被分配到動態規劃的大類裡面,已經說明了解題思路了。其實不看答案我也不知道可以這樣做。基本的思想是這樣的,維護一個二維陣列dp,dp[i][j]表示長度為i的字串轉化為長度為j的字串所需要的最小改動個數。下標為0表示空串。這樣一來,二維陣列的第一行和第一列就很容易填充了,因為空串到其他字串的最小改動次數都等於其他字串的長度。與經典的動態規劃解法一樣,剩下的就是填充dp的其他部分了。這裡是一般想不到的地方:

1、如果兩個字串的最後一個字元相同的話,那麼從串a到串b的最小改動次數等於串a串b都去掉最後一個字元的最小改動次數。

      即dp[i][j] = dp[i-1][j-1].

2、如果最後一個字元不同的話,那麼從串a到串b的最小改動次數,需要從這三種情況裡面選取。串a去最後一個字元到串b,串a          去最後一個字元到串b去最後一個字元,串a到串b去最後一個字元,取這3者的最小值然後+1即可。

整個過程從0分別對串a和串b一個字元一個字元的增加長度,記錄下最小轉化字元數。最終增加到長度與word1與word2相同時,便得到了結果。

程式碼

class Solution {
public:
    int minDistance(string word1, string word2) {
        int s1 = word1.size();
        int s2 = word2.size();
        int dp[s1+1][s2+1];
        dp[0][0] = 0;
        for(int i=1;i<=s1;i++)
            dp[i][0] = i;
        for(int i=1;i<=s2;i++)
            dp[0][i] = i;
        for(int i=1;i<=s1;i++)
            for(int j=1;j<=s2;j++)
            {
                if(word1[i-1]==word2[j-1]) dp[i][j] = dp[i-1][j-1];
                else dp[i][j] = min(dp[i-1][j],min(dp[i-1][j-1],dp[i][j-1]))+1;
            }
        return dp[s1][s2];
    }
};