码迷,mamicode.com
首页 > 其他好文 > 详细

最小编辑距离dp

时间:2020-07-13 15:26:01      阅读:53      评论:0      收藏:0      [点我收藏+]

标签:删除   blank   etc   vector   次数   操作   直接   分析   open   

以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问题看似很难,感觉无从下手,但是分析起来还是挺简单的,常见的最小编辑问题每一个操作所需要的代价往往是不同的,但是思路是一模一样的。

最小编辑距离dp

标签:删除   blank   etc   vector   次数   操作   直接   分析   open   

原文地址:https://www.cnblogs.com/Accepting/p/13293290.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!