题目描述
给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。
你可以对一个单词进行如下三种操作:

  • 插入一个字符
  • 删除一个字符
  • 替换一个字符

编辑距离:是指两个字符串之间,由一个转成另一个所需的最少编辑操作次数。
问题:word1到word2的编辑距离
子问题:word1前i个字符到word2前j个字符的编辑距离
假如有两个字符串"hat"和"wtct"
每个格子表示word1前i个字符到word2前j个字符的编辑距离

i表示插入操作,d表示删除操作,r表示替换操作。

第一行w可以由空字符串“”插入一个w得到,操作一次;wh可以由“”插入w再插入h得到,插入两次,依次得到“”到whct的操作次数。

第一列由h变为“”可以对h进行一次删除操作,由ha变为“”可以先删除h再删除a,操作两次;由hat变为“”可以进行三次删除操作依次删除三个字母。

F(1, 1)表示由h变为w的编辑距离,
由h到w,可以先在h前面插入一个w,变为wh,再把h删除,操作两次,即用F(0, 2)的状态下再加一次删除操作。
还可以先把h删除,再插入一个w,操作两次,即用F(1, 0)的状态再加一次插入操作。
还可以把h替换成w,操作一次,可以用F(0, 0)的状态加一次替换操作表示。
这三种操作都能将h变为w,而我们需要的是最少的操作次数,所以选择替换。F(1,1) 就为1。

F(1, 2)表示h变为wh的编辑距离,
由h到wh,可以先在h的前面进行两次插入操作插入wh,再将原来的h删除,即可以用F(0, 2)的状态加一次删除操作。
还可以把h先替换成w,然后再插入h,即F(1, 1)的状态再加一次插入操作。
还可以再h的前面直接插入w,即F(0, 1)的状态,由于字符h和wh的第二个字符相同,所以不需要再进行替换操作,用F(0, 1)的状态就可以表示F(1, 2)。
在这三种操作中,删除操作是2+1为3,插入操作为1+1为2,不需要替换用F(0, 1)表示为1,。所以F(1, 2)为1。

F(2, 1)表示ha变为w的编辑距离,
由ha变为w,可以先将h变为w,再把a删除,即用F(1, 1)的状态再加一次删除操作。
还可以将ha变为"",再插入w,即用F(2, 0)再加一次插入操作。
还可以将h删除,将a替换成w,即用F(1, 0)的状态加一次替换操作。
删除要两次,插入要三次,替换要两次。
所以F(2, 1)为2。

F(2, 2)表示ha变为wh的编辑距离,
由ha变为wh,可以先将h变为wh,再删除a,即用F(1, 2)的状态再加一次删除操作。
还可以ha先变为w,再插入h,即F(2, 1)的状态再加一次插入操作。
还可以将h替换成w,再将a替换成h,即F(1, 1)的状态再加一次替换操作。
在这一步想要进行删除操作需要2次(F(1, 2) + 1), 进行插入操作需要
3次(F(2, 1 + 1)), 进行替换操作需要2次(F(1, 1) + 1),所以F(2, 2)为2。

经过分析可以得出状态转移方程:
word2的每一个子串都可由word1的子串进行插入,删除,替换这三种操作得到,我们需要的是操作次数最少的结果,即:
F(i, j) = min(插入,删除,替换)
F(i, j) = min(F(i, j - 1) + 1, F(i - 1, j) + 1, F(i - 1, j - 1) + (w1[i] == w2[j] ? 0 : 1))
这里需要注意的是替换操作如果word1[i]和word2[j]相等就不需要进行替换了。

代码:

class Solution {public:int minDistance(string word1, string word2) {int row = word1.size() + 1;int col = word2.size() + 1;int dp[row][col];//把第一行和第一列初始化for(int j = 0; j < col; ++j){dp[0][j] = j;}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){//如果两次字符相等,不需要替换操作//就像上图的由h-->whif(word1[i - 1] == word2[j - 1])dp[i][j] = dp[i - 1][j - 1];elsedp[i][j] = min(dp[i - 1][j - 1], min(dp[i - 1][j], dp[i][j - 1])) + 1;}}return dp[row - 1][col - 1];}
};

编辑距离(动态规划)相关推荐

  1. 123. Leetcode 72. 编辑距离 (动态规划- 字符串系列)

    步骤一.确定状态: 确定dp数组及下标含义 dp[i][j]表示word1[:i]的单词与word2[:j]单词之间的最小编辑距离 步骤二.推断状态方程: 在确定递推公式的时候,首先要考虑清楚编辑的几 ...

  2. 最小编辑距离 动态规划 python

    m和n的两个字符串,设有以下几种操作:替换(R),插入(I)和删除(D)且都是相同的操作.求转换一个字符串到另一个需要的最少操作数量.这个数量就可以被视为最小编辑距离.如:acd与ace的Editio ...

  3. python距离向量路由算法_python算法练习——动态规划与字符串的编辑距离

    动态规划与字符串的编辑距离 动态规划 动态规划(dynamic programming)是解决多阶段决策问题常用的最优化理论,该理论由美国数学家Bellman等人在1957年提出,用于研究多阶段决策过 ...

  4. 动态规划求编辑距离 - 残阳似血的博客

    动态规划求编辑距离 - 残阳似血的博客 动态规划求编辑距离 - 残阳似血的博客 动态规划求编辑距离 位于分类 自然语言处理 这两天在写一个简单的单词拼写检查器(Spell checker),本来求编辑 ...

  5. LeetCode动态规划基础题-总结(超级长文)

    前言 五一留校,要不学习一下,整理了一下之前学习的动态的笔记~- -_--- 这部分的题目 确实很有质量的呀,认真看完,会有收获的啦. 感谢代码随想录.LeetCode 真是非常好的练习平台和习题讲解 ...

  6. 旅行商问题(动态规划方法,超级详细的)

    一.题目 一个售货员必须访问n个城市,恰好访问每个城市一次,并最终回到出发城市. 售货员从城市i到城市j的旅行费用是一个整数,旅行所需的全部费用是他旅行经过的的各边费用之和,而售货员希望使整个旅行费用 ...

  7. 经典动态规划:戳气球问题

    点击上方蓝字设为星标 东哥带你手把手撕力扣~ 作者:labuladong   公众号:labuladong 若已授权白名单也必须保留以上来源信息 今天我们要聊的这道题「Burst Balloon」和之 ...

  8. java动态规划鸡蛋问题_动态规划系列/高楼扔鸡蛋问题.md · lipengfei/fucking-algorithm - Gitee.com...

    # 经典动态规划问题:高楼扔鸡蛋 今天要聊一个很经典的算法问题,若干层楼,若干个鸡蛋,让你算出最少的尝试次数,找到鸡蛋恰好摔不碎的那层楼.国内大厂以及谷歌脸书面试都经常考察这道题,只不过他们觉得扔鸡蛋 ...

  9. 编辑距离(Edit Distance)

    编辑距离是用于比较两个字符串或者符号序列之间距离的常用距离函数. 含义为:给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数,可以对一个单词进行如下 ...

  10. 字符串相似度之编辑距离算法

    字符串编辑距离: 是一种字符串之间相似度计算的方法.给定两个字符串S.T,将S转换成T所需要的删除,插入,替换操作的数量就叫做S到T的编辑路径.而最短的编辑路径就叫做字符串S和T的编辑距离. 举个例子 ...

最新文章

  1. ffmpeg3.3新版本AVStream的封装流参数由codec替换codecpar
  2. 【Spring-web】RestTemplate源码学习——梳理内部实现过程
  3. 数据结构与算法 —— 二叉树
  4. android控制音量加减命令 python_盘点5种基于Python生成的个性化语音方法
  5. hdu 1027 STL next_permutation
  6. php外联样式,css外联样式不起作用怎么办
  7. 【python】Get与Post的区别?(面试官最想听到的答案)
  8. werkzeug routing.Rule
  9. Spark SQL应用解析
  10. python画图颜色代码rgb_python – matplotlib 3D散点图,其标记颜色对应于RGB值
  11. bbs小项目整理(八)(总结、源码分享)
  12. 在ASP.NET中执行URL重写(一)
  13. Linux中文件权限(有图详细讲解)
  14. Springboot+Thymeleaf《药品管理系统》
  15. Python数据处理(入门教程)
  16. 两个对象值相同(x.equals(y) == true),但却可有不同的hashCode,这句话对不对?
  17. Task.Result卡死问题
  18. R语言导入数据文件 (Excel文件、csv文件导入R)
  19. 区块链在金融行业有哪些应用
  20. authorization权限控制_授权(Authorization)

热门文章

  1. 三体·Round - 智子(Easy Version)
  2. 判断IPV6地址格式是否正确
  3. (翻译)声誉模式(Reputation)
  4. 虚拟机中Linux与主机共享文件方法
  5. DPDK vhost库
  6. win10提示“无法枚举容器中的对象 访问被拒绝”解决 方法完美版
  7. centos emqttd 笔记
  8. 引入线程的c语言程序,在引入线程的操作系统中,资源分配的基本单位是____。A.线程;B.进程;C.作业;D.程序;...
  9. aws简单开发之ec2定时开关机
  10. PointNet、PointNet++ 基于深度学习的3D点云分类和分割