题目链接

LeetCode 72. 编辑距离[1]

题目描述

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

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

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

示例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')

题解

这是一道典型的动态规划题目,我们用 表示 转换成 所需要的最小步数。那么对于最后一个字符来说,有如下四种情况:

  • 如果 ,那么最后一个字符不需要操作,答案就是
  • 如果 最后一步操作是插入得到的,那么问题就转化为了 转换成 所需要的最小步数。最后再插入 就行了,答案就是
  • 如果 最后一步操作是删除得到的,那么问题就转化为了 转换成 所需要的最小步数。最后再删除 就行了,答案就是
  • 如果 最后一步操作是替换得到的,那么问题就转化为了 转换成 所需要的最小步数。最后再将 替换为 就行了,答案就是

综上,如果 ,那么 。否则的话:

初始化就是,所有的 ,因为需要插入 次。所有的 ,因为需要删除 次。

总的时间复杂度就是

代码

c++

        class Solution {public:int minDistance(string word1, string word2) {int n = word1.size(), m = word2.size();vector<vector<int> > dp(n+1, vector<int>(m+1, INT_MAX));dp[0][0] = 0;for (int i = 0; i < m; ++i) dp[0][i+1] = i + 1;for (int i = 0; i < n; ++i) dp[i+1][0] = i + 1;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];continue;}// 插入
                dp[i+1][j+1] = min(dp[i+1][j+1], dp[i+1][j]+1);// 删除
                dp[i+1][j+1] = min(dp[i+1][j+1], dp[i][j+1]+1);// 替换
                dp[i+1][j+1] = min(dp[i+1][j+1], dp[i][j]+1);}}return dp[n][m];}
};

python

        class Solution:def minDistance(self, word1: str, word2: str) -> int:n, m = len(word1), len(word2)dp = [[0]*(m+1) for _ in range(n+1)]dp[0] = [i for i in range(m+1)]for i in range(n+1): dp[i][0] = ifor i in range(n):for j in range(m):if word1[i] == word2[j]:dp[i+1][j+1] = dp[i][j]continuedp[i+1][j+1] = min(dp[i+1][j], dp[i][j+1], dp[i][j]) + 1return dp[n][m]

关注【算法码上来】,每日算法干货马上就来!

参考资料

[1]

LeetCode 72. 编辑距离: https://leetcode-cn.com/problems/edit-distance/

【每日算法Day 92】经典面试题:编辑距离相关推荐

  1. 前端面试instanceof_一起回归一下每日一题这些经典面试题

    " 需求已改活已加,加班通宵看朝霞.终是上线已延期,bug还是改不完. 面试造火箭,工作拧螺丝,虽然我只想拧螺丝,可是我需要用造火箭的技术去寻找拧螺丝的工作,如何能在面试过程中让自己处于不败 ...

  2. 数据结构经典面试题-图

    本系列针对面试中[经典]手写算法题进行分类和汇总,每篇主要包含两大部分:基础知识和面试经典题目. 本篇的主角是[图],说实话,图的相关算法不是很多,但是这些经典算法在面试中会经常出现,因为:图算法相对 ...

  3. 搬砖:算法经典面试题

    算法经典面试题 https://blog.csdn.net/pcpanchen/article/details/16851151 1.把二元查找树转变成排序的双向链表  题目: 输入一棵二元查找树,将 ...

  4. 【每日算法】C语言8大经典排序算法(2)

    接上文--->[每日算法]C语言8大经典排序算法(1) 二.插入类排序 插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中 ...

  5. < 每日算法 - Javascript解析:经典弹珠游戏 >

    每日算法 - JavaScript解析:弹珠游戏 一.任务描述: > 示例一: >示例二 二.题意解析 三.解决方案: 往期内容

  6. 【Linux 经典面试题】

    [Linux  经典面试题] 1. 在Linux系统中,以 文件 方式访问设备 . 2. Linux内核引导时,从文件 /etc/fstab 中读取要加载的文件系统. 3. Linux文件系统中每个文 ...

  7. 消除左递归c++代码_【每日算法Day 85】图解算法:一行代码解决约瑟夫环的变体...

    题目链接 LeetCode 390. 消除游戏[1] 题目描述 给定一个从 到 排序的整数列表. 首先,从左到右,从第一个数字开始,每隔一个数字进行删除,直到列表的末尾. 第二步,在剩下的数字中,从右 ...

  8. java面试题_阿里大厂流出的数百道 Java 经典面试题

    BAT 常问的 Java基础39道常见面试题 1.八种基本数据类型的大小,以及他们的封装类 2.引用数据类型 3.Switch能否用string做参数 4.equals与==的区别 5.自动装箱,常量 ...

  9. linux(1):Linux经典面试题

    Linux经典面试题,看看你会几题? 1. 在Linux系统中,以 文件 方式访问设备 . 2. Linux内核引导时,从文件 /etc/fstab 中读取要加载的文件系统. 3. Linux文件系统 ...

  10. 2023秋招大厂经典面试题及答案整理归纳(1-20)校招必看

    目录 前言 1. 使用mysql索引都有哪些原则?索引什么数据结构? 1). 对于查询频率高的字段创建索引: 2). 对排序.分组.联合查询频率高的字段创建索引: 3). 索引的数目不宜太多 4). ...

最新文章

  1. 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数011,ocr,字符识别
  2. 一些java基本程序图解2
  3. 04_SSM整合ActiveMQ支持多种类型消息
  4. html文件内容搜索,html读出文本文件内容
  5. C++OpenCV:三角形插值、线面的交点
  6. webpack 中的 watch cache (下)
  7. kafka内置分区及自定义分区
  8. Linux学习——磁盘分区管理
  9. 45岁以后的IT人生
  10. 金蝶K3老单新增自定义菜单按钮
  11. OpenCart支付宝付款接口(直接到账、担保交易、双接口)
  12. php session auto_start,PHP出现 Warning: session_start()的解决方法
  13. python语言基础(傻瓜式文档)
  14. 计算机启动应用程序的方法,应用程序无法正常启动,教您应用程序无法正常启动的解决方法...
  15. 互联网春招和秋招的区别
  16. 2021 长安杯 Re
  17. Android系统移植与调试之-------build.prop文件详细赏析
  18. 英语3500词(18/20)health主题(2022.4.28)
  19. 谷粒商城高级篇(38)——异步编排之商品详情查询
  20. 用jquery获取tbody下的第一个tr的最后一个td里面的第一个a标签

热门文章

  1. ArcSDE 10.2 for Oracle 12C安装注意事项
  2. repeater上EVAL绑定后台方法并且传参数
  3. android小程序:计算圆面积
  4. c#的IList,IEnumerable和IEnumerator
  5. PETSHOP模式IDAL,SQLSERVERDAL,存储过程以及模型类代码的生成工具
  6. 20190818 On Java8 第八章 复用
  7. bzoj1042硬币购物
  8. Qt5.3.2(VS2010)_调试_进入Qt源码
  9. Foundation 6 – 先进的响应式的前端开发框架
  10. Linux内存管理:Linux 可加载内核模块剖析:2.6 内核透视图