72. 编辑距离


再次验证leetcode的评判机有问题啊!同样的代码,第一次提交超时,第二次提交就通过了!

此题用动态规划解决。

这题一开始还真难到我了,琢磨半天没有思路。于是乎去了网上喵了下题解看到了动态规划4个字就赶紧回来了。

脑海中浮现了两个问题:
为什么能用动态规划呢?用动态规划怎么解?

先描述状态吧:

f[i][j]表示word1中的[0,i] 与 word2中[0,j]的最少操作数。

实际上这时候就能看出来了,当一个状态计算完成时,即一个状态的操作方案(决策)确定时,不影响后面状态的最优决策。即满足动态规划要求的无后效性,否则不能用动规来解决啦,因为要涉及到回溯修改前面的决策。也就是满足两个条件:1. 重叠子问题 2.最优子结构

动态规划原理
虽然已经用动态规划方法解决了上面两个问题,但是大家可能还跟我一样并不知道什么时候要用到动态规划。总结一下上面的斐波拉契数列和钢条切割问题,发现两个问题都涉及到了重叠子问题,和最优子结构。

①最优子结构

用动态规划求解最优化问题的第一步就是刻画最优解的结构,如果一个问题的解结构包含其子问题的最优解,就称此问题具有最优子结构性质。因此,某个问题是否适合应用动态规划算法,它是否具有最优子结构性质是一个很好的线索。使用动态规划算法时,用子问题的最优解来构造原问题的最优解。因此必须考查最优解中用到的所有子问题。

②重叠子问题

在斐波拉契数列和钢条切割结构图中,可以看到大量的重叠子问题,比如说在求fib(6)的时候,fib(2)被调用了5次,在求cut(4)的时候cut(0)被调用了4次。如果使用递归算法的时候会反复的求解相同的子问题,不停的调用函数,而不是生成新的子问题。如果递归算法反复求解相同的子问题,就称为具有重叠子问题(overlapping subproblems)性质。在动态规划算法中使用数组来保存子问题的解,这样子问题多次求解的时候可以直接查表不用调用函数递归。

显然,状态转移方程也就出来了:

f[i][j] 的计算分为两种情况:

  1. 当word1[i] == word2[j] 说明此时不需要任何操作,f[i][j] = f[i-1][j-1]
  2. else f[i][j] = min(f[i-1][j-1] , f[i-1][j] , f[i][j-1] ) + 1 , 此时,f[i][j] 可由之前已经确定的三个状态而来(因为有三种操作),如果是word1替换操作,则之前的状态为f[i-1][j-1];word1删除操作,则之前的状态为: f[i-1][j],此时就是删除word[i];word1插入操作,则之前的状态为:f[i][j-1],此时实际上就是在word[i]后面插入word2[j]

那初始条件呢?当一方为空时,最少操作数就是另一个word的size了

for (int i = 0; i <= m; i++) {f[i][0] = i;}for (int j = 0; j <= n; j++) {f[0][j] = j;}

1A代码

class Solution {public int minDistance(String word1, String word2) {int m = word1.length();int n = word2.length();if (m == 0) {return n;}if (n == 0) {return m;}int[][] f = new int[m + 1][n + 1];for (int i = 0; i <= m; i++) {f[i][0] = i;}for (int j = 0; j <= n; j++) {f[0][j] = j;}for (int i = 1; i <= m; i++) {for (int j = 1; j <= n; j++) {if (word1.charAt(i - 1) == word2.charAt(j - 1)) {f[i][j] = f[i - 1][j - 1];} else {f[i][j] = Collections.min(Arrays.asList(f[i - 1][j - 1], f[i - 1][j], f[i][j - 1])) + 1;}}}return f[m][n];}
}

转载于:https://www.cnblogs.com/acbingo/p/9369297.html

[leetcode] 72. 编辑距离(二维动态规划)相关推荐

  1. 二维动态规划降维误差一般为多少_动态规划 所有题型的总结

    1 动态规划 1.1 定义 动态规划的核心是状态和状态转移方程. 在记忆化搜索中,可以为正在处理的表项声明一个引用,简化对它的读写操作: 动态规划解决的是多阶段决策问题: 初始状态→│决策1│→│决策 ...

  2. LeetCode 240. 搜索二维矩阵 II(二分查找 分治)

    文章目录 1. 题目 2. 解题 2.1 从左下角或者右上角开始搜索 2.2 分治算法 1. 题目 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target.该矩阵具有以 ...

  3. LeetCode 251. 展开二维向量

    文章目录 1. 题目 2. 解题 1. 题目 请设计并实现一个能够展开二维向量的迭代器.该迭代器需要支持 next 和 hasNext 两种操作.. 示例: Vector2D iterator = n ...

  4. [leetcode] 72.编辑距离

    给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 . 你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字符 替换一个字符 示例 1: ...

  5. 二维动态规划降维误差一般为多少_动态规划--5道题入门

    动态规划是由递归一步步优化出来的 递归–>记忆化递归–>动态规划 动态规划与其说是一个算法,不如说是一种方法论.该方法论主要致力于将合适的问题拆分成三个子目标--击破: 1.建立状态转移方 ...

  6. leetcode 74. 搜索二维矩阵(二分)

    编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值.该矩阵具有如下特性: 每行中的整数从左到右按升序排列. 每行的第一个整数大于前一行的最后一个整数. 示例 1: 输入:matrix = ...

  7. Java实现 LeetCode 72 编辑距离

    72. 编辑距离 给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 . 你可以对一个单词进行如下三种操作: 插入一个字符 删除一个字符 替换一个字 ...

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

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

  9. LeetCode 72.编辑距离(动态规划)

    编辑距离 针对两个字符串(如英文字母)的差异程度的量化测量,量测方式是看至少需要多少次的处理才能将一个字符串变成另一个字符串. 编辑距离应用 一.可应用于NLP,如拼写检查可以根据一个拼错的字和其他正 ...

最新文章

  1. jdbc hibernate ibatis 操作Blob 和Clob类型字段(不断更新)
  2. Unity 高清渲染管线 ShaderGraph 实现简单的表面水流效果
  3. 如何在 Centos7 x86_64下将vim一键配置为一款强大的C++,IDE
  4. 作者:许会泉,男,北京金信网银金融信息服务有限公司研发总监。
  5. offes给excel增加下拉选项_财务“救星”:Excel不止可以下拉单元格,还可以进行成本核算...
  6. python之集合操作
  7. php 常用函数 180,php 部分常用函数
  8. 服务器c盘清理文件,如何清理Windows服务器的C盘
  9. PCSHARE VIP 2005源代码
  10. 李彦宏:离破产永远只有30天
  11. Sping Cloud专栏:路由Gateway有效避免 Only one connection receive subscriber allowed问题
  12. 第一篇Blog,随便写一点吧:)
  13. 剑指offe系列之6:旋转数组的最小值
  14. 第二次·2020-09-21
  15. 2016年中山市信息学竞赛暨全国信息学联赛成绩表(普及组)
  16. SAP-ME mobile开发基础
  17. mac使用Simulator打开IOS模拟器(不使用Xcode打开IOS模拟器)
  18. Freetype学习笔记
  19. JAVA EE Apache Zookeeper / Google Chubby
  20. 补码一位乘法(Booth算法)

热门文章

  1. 简单几步制作软raid
  2. [分享]千万数量级分页存储过程(效果演示)
  3. no Bloomberg, wind, ceic, csmar at cambridge
  4. 《企业的边界》的书摘
  5. IPv6网络协议的安全疑云
  6. Bochs调试加载符号文件的问题
  7. CNCF推出云原生网络功能(CNF)Testbed
  8. PhpStorm快捷键
  9. Linux系统性能监控之6个vmstat和6个iostat命令
  10. jQuery加载一个html页面到指定的div里