[LeeCode] Edit Distance解法
阿新 • • 發佈:2018-12-10
題目
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:
- Insert a character
- Delete a character
- 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]; } };