leetcode第72题:编辑距离
给定两个单词 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'网易面试时遇到了这题,当时没做出来,想不出来状态转移方程。解题思路如下:
首先定义状态矩阵,dp[m][n],其中m为word1的长度+1,n为word2的长度+1,为什么+1?因为要考虑如果word1或word2为空的情况,后面可以看到。
定义dp[i][j]为word1中前i个字符组成的串,与word2中前j个字符组成的串的编辑距离。
插入操作:在word1的前i个字符后插入一个字符,使得插入的字符等于新加入的word2[j]。这里要考虑清楚,插入操作对于原word1字符来说,i是没有前进的,而对于word2来说是前进了一位然后两个字符串才相等的。所以此时是dp[i][j]=dp[i][j-1]+1。
删除操作:在word1的第i−1个字符后删除一个字符,使得删除后的字符串word[:i-1]与word2[:j]相同。这里要考虑清楚,删除操作对于原word2字符来说,j−1是没有前进的,而对于word1来说是删除了一位然后两个字符串才相等的。所以此时是dp[i][j]=dp[i-1][j]+(0 or 1)。
代码如下:
class Solution:def minDistance(self, word1, word2):m=len(word1)+1; n=len(word2)+1dp = [[0 for i in range(n)] for j in range(m)]for i in range(n):dp[0][i]=ifor i in range(m):dp[i][0]=ifor i in range(1,m):for j in range(1,n):if word1[i-1] == word2[j-1]:dp[i][j] = dp[i-1][j-1]else:dp[i][j] = min(dp[i][j-1], dp[i-1][j], dp[i-1][j-1]) + 1return dp[m-1][n-1]word1 = "intention" word2 = "execution" test = Solution() print(test.minDistance(word1, word2))
答案来源:https://blog.csdn.net/iyuanshuo/article/details/80112211
def minDistance(self, S1, S2):m = len(S1) + 1;n = len(S2) + 1dp = [[0 for i in range(n)] for j in range(m)]for i in range(n):dp[0][i] = ifor i in range(m):dp[i][0] = ifor i in range(1, m):for j in range(1, n):if S1[i - 1] == S2[j - 1]:dp[i][j] = dp[i - 1][j - 1]else:dp[i][j] = min(dp[i][j - 1], dp[i - 1][j], dp[i - 1][j - 1]) + 1return dp[m - 1][n - 1]
转载于:https://www.cnblogs.com/tsdblogs/p/9977577.html
leetcode第72题:编辑距离相关推荐
- leetcode:72. 编辑距离
题目来源 leetcode 题目描述 class Solution {public:int minDistance(string word1, string word2) {} }; 题目解析 什么叫 ...
- [LeetCode]高频算法题
建议在准备面试前的1-2周过一遍,这里尽量用简短的几个词,记录每道题的核心解法,帮助记忆 怎么用这个文档: 1)如果你还有1-2个月开始面试,那就跟着这个文档一道一道的写吧,看看里面说的解法是否符合你 ...
- Leetcode重点250题
LeetCode重点250题 这个重点题目是把LeetCode前400题进行精简.精简方法如下: 删除不常考,面试低频出现题目 删除重复代码题目(例:链表反转206题,代码在234题出现过) 删除过于 ...
- 【Leetcode】 刷题之路1(python)
leetcode 刷题之路1(python) 看到有大佬总结了一些相关题目,想着先刷一类. 1.两数之和 15.三数之和 16.最接近的三数之和 11.盛最多的水 18.四数之和 454.四数相加II ...
- 15.使用一样的BFS方法(代码几乎一模一样)解决多道LeetCode题目--542题(01矩阵)1765题(地图中的最高点)994腐烂的橘子
一.综述 本文总结自己刷LeetCode中遇到的使用BFS方法解决相同类型的题目.(代码几乎是一模一样) 二.01矩阵(LeetCode第542题) class Solution {int[][] d ...
- leetcode每日刷题计划-简单篇day8
leetcode每日刷题计划-简单篇day8 今天是纠结要不要新买手机的一天QAQ想了想还是算了吧,等自己赚钱买,加油 Num 70 爬楼梯 Climbing Stairs class Solutio ...
- 【leetcode】 算法题1 两数之和
[leetcode] 算法题1 两数之和 问题 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数. 你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用. 示例: 给定 nums ...
- leetcode第七题整数反转
leetcode第七题: 提示:这里简述项目相关背景: 挑一题简单一点的试试手 问题描述: 原因分析: 提示:这里填写问题的分析: 通过了1031个案例应该是边界问题 解决方案: 提示:先改改待会来补 ...
- leetcode贪心算法题集锦(持续更新中)
leetcode贪心算法题集锦 leetcode贪心算法题集锦(持续更新中).python 和C++编写. 文章目录 leetcode贪心算法题集锦 一.贪心算法 1.盛最多水的容器 2.买股票的最佳 ...
最新文章
- 《面向对象分析与设计》读书笔记——第一章 复杂性
- java开学第一周测试自我感想
- Hystrix断路器(五)
- selenium浏览器驱动下载地址整理
- 程序员过关斩将--数据库的乐观锁和悲观锁并非真实的锁
- Linux加密框架中的算法和算法模式
- access 报表中序号自动_数据报表多种序号生成方式
- ylbtech-Bill(发票管理)-数据库设计
- utilities(matlab)—— 多元函数的数值梯度
- [linux]tcpdump抓包
- 成人python培训_B2B优选:成人编程爱好者学习
- Android将毫秒转为时分秒
- aspupload ,在winows server 2008 下无法使用
- js去掉url中的域名
- 2021-06-22
- linux 定时任务 数量 性能,Linux 性能测试与分析
- Linux如何安装mysql数据库
- web渗透-Web服务通信原理
- 校园表白墙网站PHP源码
- FCFS进程调度算法
热门文章
- java基础69 JavaScript产生伪验证码(网页知识)
- Android 动态Tab分页效果
- ArcGIS Desktop开发基础(转)
- android开发相关资料整理【2011-10-29】
- 不要以自己的想法来推测别人的行为
- ffmpeg中av_strlcpy替换了pstrcpy
- Linux 下安装配置C/C++开发环境 Code::Blocks
- 深圳的中学计算机课学什么时候,2018-2019年深圳中小学校历出炉 中小学校什么时候几号开学...
- python简单网络爬虫_【Python】简单的网络爬虫
- 电脑边充电边用好吗_平板电脑充电推车厂家哪家好?