【每日算法Day 92】经典面试题:编辑距离
题目链接
LeetCode 72. 编辑距离[1]
题目描述
给你两个单词 word1
和 word2
,请你计算出将 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】经典面试题:编辑距离相关推荐
- 前端面试instanceof_一起回归一下每日一题这些经典面试题
" 需求已改活已加,加班通宵看朝霞.终是上线已延期,bug还是改不完. 面试造火箭,工作拧螺丝,虽然我只想拧螺丝,可是我需要用造火箭的技术去寻找拧螺丝的工作,如何能在面试过程中让自己处于不败 ...
- 数据结构经典面试题-图
本系列针对面试中[经典]手写算法题进行分类和汇总,每篇主要包含两大部分:基础知识和面试经典题目. 本篇的主角是[图],说实话,图的相关算法不是很多,但是这些经典算法在面试中会经常出现,因为:图算法相对 ...
- 搬砖:算法经典面试题
算法经典面试题 https://blog.csdn.net/pcpanchen/article/details/16851151 1.把二元查找树转变成排序的双向链表 题目: 输入一棵二元查找树,将 ...
- 【每日算法】C语言8大经典排序算法(2)
接上文--->[每日算法]C语言8大经典排序算法(1) 二.插入类排序 插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中 ...
- < 每日算法 - Javascript解析:经典弹珠游戏 >
每日算法 - JavaScript解析:弹珠游戏 一.任务描述: > 示例一: >示例二 二.题意解析 三.解决方案: 往期内容
- 【Linux 经典面试题】
[Linux 经典面试题] 1. 在Linux系统中,以 文件 方式访问设备 . 2. Linux内核引导时,从文件 /etc/fstab 中读取要加载的文件系统. 3. Linux文件系统中每个文 ...
- 消除左递归c++代码_【每日算法Day 85】图解算法:一行代码解决约瑟夫环的变体...
题目链接 LeetCode 390. 消除游戏[1] 题目描述 给定一个从 到 排序的整数列表. 首先,从左到右,从第一个数字开始,每隔一个数字进行删除,直到列表的末尾. 第二步,在剩下的数字中,从右 ...
- java面试题_阿里大厂流出的数百道 Java 经典面试题
BAT 常问的 Java基础39道常见面试题 1.八种基本数据类型的大小,以及他们的封装类 2.引用数据类型 3.Switch能否用string做参数 4.equals与==的区别 5.自动装箱,常量 ...
- linux(1):Linux经典面试题
Linux经典面试题,看看你会几题? 1. 在Linux系统中,以 文件 方式访问设备 . 2. Linux内核引导时,从文件 /etc/fstab 中读取要加载的文件系统. 3. Linux文件系统 ...
- 2023秋招大厂经典面试题及答案整理归纳(1-20)校招必看
目录 前言 1. 使用mysql索引都有哪些原则?索引什么数据结构? 1). 对于查询频率高的字段创建索引: 2). 对排序.分组.联合查询频率高的字段创建索引: 3). 索引的数目不宜太多 4). ...
最新文章
- 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数011,ocr,字符识别
- 一些java基本程序图解2
- 04_SSM整合ActiveMQ支持多种类型消息
- html文件内容搜索,html读出文本文件内容
- C++OpenCV:三角形插值、线面的交点
- webpack 中的 watch cache (下)
- kafka内置分区及自定义分区
- Linux学习——磁盘分区管理
- 45岁以后的IT人生
- 金蝶K3老单新增自定义菜单按钮
- OpenCart支付宝付款接口(直接到账、担保交易、双接口)
- php session auto_start,PHP出现 Warning: session_start()的解决方法
- python语言基础(傻瓜式文档)
- 计算机启动应用程序的方法,应用程序无法正常启动,教您应用程序无法正常启动的解决方法...
- 互联网春招和秋招的区别
- 2021 长安杯 Re
- Android系统移植与调试之-------build.prop文件详细赏析
- 英语3500词(18/20)health主题(2022.4.28)
- 谷粒商城高级篇(38)——异步编排之商品详情查询
- 用jquery获取tbody下的第一个tr的最后一个td里面的第一个a标签
热门文章
- ArcSDE 10.2 for Oracle 12C安装注意事项
- repeater上EVAL绑定后台方法并且传参数
- android小程序:计算圆面积
- c#的IList,IEnumerable和IEnumerator
- PETSHOP模式IDAL,SQLSERVERDAL,存储过程以及模型类代码的生成工具
- 20190818 On Java8 第八章 复用
- bzoj1042硬币购物
- Qt5.3.2(VS2010)_调试_进入Qt源码
- Foundation 6 – 先进的响应式的前端开发框架
- Linux内存管理:Linux 可加载内核模块剖析:2.6 内核透视图