1. 程式人生 > >【dp經典問題】72. Edit Distance

【dp經典問題】72. Edit Distance

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];
}
以上解答參考了:參考解答,在此表示感謝。————————————————————————(我是萌萌噠昏割線)