前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 72. 编辑距离(DP)

LeetCode 72. 编辑距离(DP)

作者头像
Michael阿明
发布2020-07-13 16:03:12
4480
发布2020-07-13 16:03:12
举报

1. 题目

给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 。

你可以对一个单词进行如下三种操作:

  • 插入一个字符
  • 删除一个字符
  • 替换一个字符
代码语言:javascript
复制
示例 1:
输入: word1 = "horse", word2 = "ros"
输出: 3
解释: 
horse -> rorse (将 'h' 替换为 'r')
rorse -> rose (删除 'r')
rose -> ros (删除 'e')

示例 2:
输入: word1 = "intention", word2 = "execution"
输出: 5
解释: 
intention -> inention (删除 't')
inention -> enention (将 'i' 替换为 'e')
enention -> exention (将 'n' 替换为 'x')
exention -> exection (将 'n' 替换为 'c')
exection -> execution (插入 'u')

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/edit-distance

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

代码语言:javascript
复制
class Solution {
public:
    int minDistance(string w1, string w2) {
        int m = w1.size(), n = w2.size(), i, j;
        if(m==0 || n==0)
        	return max(m,n);
        vector<vector<int>> dp(m,vector<int>(n,0));
        //填写第一行第一列
        for(j = 0; j < n; ++j)
        {
        	if(w1[0] == w2[j])	dp[0][j] = j;
        	else if(j != 0)	 	dp[0][j] = 1+dp[0][j-1];
        	else	 			dp[0][j] = 1;
        }
        for(i = 0; i < m; ++i)
        {
        	if(w1[i] == w2[0])	dp[i][0] = i;
        	else if(i != 0)	 	dp[i][0] = 1+dp[i-1][0];
        	else	 			dp[i][0] = 1;
        }
        //填写状态表
        for(i = 1; i < m; ++i)
        {
        	for(j = 1; j < n; ++j)
        	{
        		if(w1[i] == w2[j])
        			dp[i][j] =   min(dp[i-1][j-1], min(1+dp[i-1][j],1+dp[i][j-1]));
        		else
        			dp[i][j] = min(1+dp[i-1][j-1], min(1+dp[i-1][j],1+dp[i][j-1]));
        	}
        }
        return dp[m-1][n-1];
    }
}; 

上面代码是从字符非空开始的。


or

下面代码是从空字符开始的,代码更精简。

代码语言:javascript
复制
class Solution {
public:
    int minDistance(string word1, string word2) {
        int n1 = word1.size(), n2 = word2.size(), i, j;
        if(n1==0 || n2==0) 
            return max(n1,n2);
        int dp[n1+1][n2+1];

        // 边界状态初始化
        for(i = 0; i < n1+1; i++)
            dp[i][0] = i;
        for(j = 0; j < n2+1; j++)
            dp[0][j] = j;

        // DP
        int left, up, left_up;
        for(i = 1; i < n1+1; i++) 
        {
            for(j = 1; j < n2+1; j++) 
            {
                left    = dp[i-1][j];
                up      = dp[i][j-1];
                left_up = dp[i-1][j-1];
                if(word1[i-1] != word2[j-1]) 
                    dp[i][j] = 1 + min(left, min(up, left_up));
                else// word1[i-1] == word2[j-1]
                    dp[i][j] = left_up;
            }
        }
        return dp[n1][n2];
    }
};
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-02-14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 题目
  • 2. 解题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档