1. 程式人生 > 實用技巧 >最小編輯距離dp

最小編輯距離dp

以leetcode上的一個題目為例子。

連線

解題思路:

舉個例子。word1 = abcd word2=abce.將word1變為word2.假設我們均考慮到第4個字元,d!=e,

直接替換 也就是前三個字元需要的次數+1。把d刪除掉,讓第三個字元c和word2的第四個字元匹配,在d的後邊新增一個字元e,讓這個e和word2中的e匹配,那麼word1中的第四個就和word2中的第3個匹配了。

設dp[i][j]表示word1中的前i個字元和word2中的前j個字元匹配需要編輯的最少次數。

word1中的第i個字元和word2中的第j個字元匹配,匹配成功dp[i][j]=dp[i-1][j-1]。

匹配不成功,如果考慮替換的話,dp[i][j]=dp[i-1][j-1]+1,若是刪除第i個字元dp[i][j]=dp[i-1][j]+1,若是新增一個字元,dp[i][j]=dp[i][j-1]+1;

code:

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

總結:這一類的dp問題看似很難,感覺無從下手,但是分析起來還是挺簡單的,常見的最小編輯問題每一個操作所需要的代價往往是不同的,但是思路是一模一樣的。