【dp經典問題】72. Edit Distance
阿新 • • 發佈:2019-02-04
Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2. (each operation is counted as 1 step.)
You have the following 3 operations permitted on a word:
a) Insert a character
b) Delete a character
c) Replace a character
沒記錯的話這是一道CLRS上的課後題,用來當面試題還是有點喪心病狂的=。=
難在狀態方程比較多,需要一個個分類討論。
用dp(i,j)表示把word1[0..i-1]變成word2[0..j-1]需要的最小編輯距離。那麼:
(1)可以看到,邊界情況出現在i=0或者j=0的時候,此時對應於空串的情形,顯而易見,將某一個串轉換為空串的最小編輯距離就是這個串的長度,因此:
dp(0,i)=i
dp(i,0)=i
(2)搞定邊界以後來看一般一點的情況:
如果word1[i-1]=word[j-1],dp[i][j]=dp[i-1][j-1],否則的話,接下來有三種可能:
①replace:
dp[i][j]=dp[i-1][j-1]+1
②delete:
假如word1長一點,需要delete,例如abc和ab
dp[i][j]=dp[i-1][j]+1
③insert:
dp[i][j]=dp[i][j-1]+1
於是得到下面的程式碼:
以上解答參考了:參考解答,在此表示感謝。————————————————————————(我是萌萌噠昏割線)int minDistance(string word1, string word2) { int row=word1.length(); int col=word2.length(); vector<vector<int>> dp(row+1,vector<int>(col+1,0)); for(int i=0;i<=col;i++) dp[0][i]=i; for(int i=0;i<=row;i++) dp[i][0]=i; 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]; }