【算法-力扣】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')

提示:
0 <= word1.length, word2.length <= 500
word1 和 word2 由小写英文字母组成
 

二、解题思路 

   1、首先确定DP数组以及它的含义

        这里我们使用一个二维的DP数组dp[i][j],此时dp[i][j]就表示word1和word2对应的i和j位置结束的时候转换后的最少操作次数。比如word1为abc,word2为dcdb,则dp[1][3]就表示ab转换成dcdb的最少转换次数。这个dp[i][j]的含义一定要记住,不然后面再推导递推公式的时候就很容易把自己绕晕!

   2、如何初始化dp数组

        首先我们要确定,我们要初始化dp数组的哪些位置。因为我们的dp[i][j]表示的是word1和word2对应的i和j位置结束的时候转换后的最少操作次数。所以,最终的我们要的结果也就是dp二维数组的最后一个元素。

 所以,这里我们需要初始化dp数组的第一行和第一列。这样,最终我们才能根据第一行和第一列的数据来推导出来最终的结果。

        那么,问题来了,我们该如何初始化第一行和第一列的数据呢?

       比如,word1为abc,word2为dcdb。我们初始化第一行的时候,那就是要求出a分别转换成d、dc、dcd、dcdb时的最少操作次数。显然这样初始化是非常麻烦的,甚至是不可完成的!那么我们再假设word1为zabc,word2为zdcdb。此时我们初始化第一行的时候,则就是求z分别转换成z、zd、zdc、zdcd、zdcdb时的最少操作次数。显然这个时候就很简单了对应最少操作次数其实就是j的值。

        那么,灵感来了!

        我们只要对word1和word2分别在它的首位置都添加一个相同的字符就行了!因为两个字符相同,所以不会影响我们最终的结果的。此时初始化dp数组就如下:

        // 初始化第一行for (int j = 0; j < n; j++)dp[0][j] = j;// 初始化第一列for (int i = 0; i < m; i++)dp[i][0] = i;

注:m是word1单词的长度,n是word2单词的长度。 

   3、确定递推公式

  • 当前遍历的dp[i][j]对应word1和word2位置上的字符相等的时候

           dp[i][j] = dp[i-1][j-1] 
      此时不需要任何操作,所以此时的 dp[i][j] = dp[i-1][j-1] 

  • 当前遍历的dp[i][j]对应word1和word2位置上的字符不相等的时候,此时就需要进行操作

        1)插入、删除

        插入和删除操作是等价的,比如a和ab我们删除b和添加b操作次数都是一样的。所以这里我们只考虑删除即可。删除有可能删除word1的i位置的元素,也有可能删除word2的j位置的元素,删除word1和删除word2对应的操作次数是不一样的,所以需要比较出一个操作次数少的。
       删除word1的i位置的元素:dp[i][j] = dp[i-1][j]+1
       删除word2的j位置的元素:dp[i][j] = dp[i][j-1]+1 

       此时在当前操作下的最少操作次数就是:

     dp[i][j] =  Math.min(dp[i-1][j]+1, dp[i][j-1]+1);

      如果此时有点晕,一定要再想dp[i][j]代表的是什么!

       2)替换

       替换也就是将word1在i位置的字符替换成word2在j位置的字符或者是将word2在j位置的字符替换成word1在i位置的字符。不管它俩谁替换谁,我们最终关心的只是操作次数。所以,这里也就是1次操作。所以,我们只要在它们俩前一个位置上的时的最少操作次数上面加1,也就是word1和word2在当前位置和当前替换操作下的最少操作次数了。

        dp[i][j] = dp[i-1][j-1]+1

最后,我们求出这些操作中哪个操作次数最少,也就是我们最终该位置上的最少操作次数了。也就是在word1和word2在i和j位置上的字符不相等的时候的递推公式了。

dp[i][j] =  Math.min( dp[i-1][j-1]+1, Math.min(dp[i-1][j]+1, dp[i][j-1]+1));

三、参考答案

class Solution {public int minDistance(String word1, String word2) {// 两个字符串前面都加个空字符串,方便后续初始化二维dp数组word1 = " " + word1;word2 = " " + word2;char[] word1Array = word1.toCharArray();char[] word2Array = word2.toCharArray();int m = word1Array.length, n = word2Array.length;// 定义一个dp二维数组,dp[i][j]表示word1和word2对应的i和j位置的时候最少操作次数int[][] dp = new int[m][n];// 初始化dp数组// 初始化第一行for (int j = 0; j < n; j++)dp[0][j] = j;// 初始化第一列for (int i = 0; i < m; i++)dp[i][0] = i;// 遍历for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {// 当当前位置相等的时候if (word1Array[i] == word2Array[j]) {dp[i][j] = dp[i - 1][j - 1];} else { // 不相等的时候需要处理dp[i][j] = Math.min(Math.min(dp[i][j-1],dp[i-1][j-1]),dp[i-1][j])+1;}}}return dp[m-1][n-1];}
}

       以上就是使用动态规划解决力扣上72题编辑距离的方法。通过使用动态规划,我们可以高效地解决这个问题,时间复杂度为O(m*n),其中m和n分别是字符串word1和word2的长度。编辑距离是一个非常有意义的问题,掌握了解决方法后,我们就可以将其应用到各种实际问题中,提高算法的效率。编辑距离在我们的实际开发中有很多的应用场景,比如拼写纠错、数据对齐、抄袭侦测等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/27155.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解析FTP服务器:从基础知识到vsftpd实战操作

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

组合和外观模式

文章目录 组合模式1.引出组合模式1.院系展示需求2.组合模式基本介绍3.组合模式原理类图4.解决的问题 2.组合模式解决院系展示1.类图2.代码实现1.AbsOrganizationComponent.java 总体抽象类用于存储信息和定义方法2.University.java 第一层&#xff0c;University 可以管理 Coll…

商城系统如何选型?

近日&#xff0c;拼多多发布618百亿补贴活动首周战报。5月19日活动启动一周内&#xff0c;百亿补贴商家参与数量相比去年618首周增长逾90%。其中&#xff0c;农产品商家同比增长83%&#xff0c;数码家电商家同比增长86%&#xff0c;美妆商家同比增长105%。 作为一家成立还不到1…

uaGate SI自动化状态监测和工业4.0解决方案

克劳斯玛菲集团&#xff08;于2016年被中国化工集团公司收购&#xff09;为其注塑和反应/挤出系统采用了uaGate SI网关技术并实行了开放且独立于平台的OPC UA标准&#xff0c;以用于设备状态自动化监控&#xff0c;这大大提高了产量并避免了机器停机问题。 自动化状态监测提高了…

文件操作学不懂,小代老师带你深入理解文件操作(下卷)

文件操作学不懂&#xff0c;小代老师带你深入理解文件操作下卷 6. ⽂件的随机读写6.1 fseek6.2 ftell6.3 rewind 7. ⽂件读取结束的判定7.1 被错误使⽤的 feof 8. ⽂件缓冲区 6. ⽂件的随机读写 6.1 fseek 根据⽂件指针的位置和偏移量来定位⽂件指针&#xff08;⽂件内容的光…

Golang使用讯飞星火AI接口

一、API申请 https://www.bilibili.com/video/BV1Yw411m7Rs/?spm_id_from333.337.search-card.all.click&vd_source707ec8983cc32e6e065d5496a7f79ee6 注册申请&#xff0c;需要在此页面获取appid、apisecret、apikey https://www.xfyun.cn/ https://console.xfyun.cn/ser…

VMware Workerstation开启虚拟机后,产生乱码名称日志文件

问题情况 如下图所示&#xff0c;我的虚拟机版本是16.1.2版本&#xff0c;每次在启动虚拟机之后&#xff0c;D盘目录下都会产生一个如图下所示的乱码名称文件。同时&#xff0c;虚拟机文件目录也是杂乱不堪&#xff0c;没有按照一台虚拟机对应一个文件夹的形式存在。 问题处理…

机器,学习没有捷径

1 捷径学习 1.1 你捷径学习了么 深度学习因为其优异的学习能力&#xff0c;已经成为推动人工智能发展当之无愧的主力军。深度学习在NLP和CV等不同的场景下都展现了优异的能力。但深度学习也存在一个与生俱来的问题&#xff1a;捷径学习。 捷径学习中的捷径表示的是一种有缺陷…

Solr 日志系统7.4.0部署和迁移到本地,Core Admin 添加新的core报错

文章目录 Solr部署Docker部署二进制部署 Tips:Solr设置账号密码方法1&#xff1a;(不使用)方法2&#xff1a; Core Admin 添加新的core报错Solr数据迁移 Solr部署 Docker部署 docker run -d -p 8983:8983 --name solr solr:latest docker run -d -p 8983:8983 -v /opt/solr:/…

学会python——密码加密(python实例四)

目录 1、认识Python 2、环境与工具 2.1 python环境 2.2 Visual Studio Code编译 3、对输入的字符加密 3.1 代码构思 3.2 代码示例 3.3 运行结果 4、总结 1、认识Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强…

Hexapod C-887使用手册 -- 4,5,6

4 - 拆包 小心拆包C-887 根据合同和发货注意比较发货范围的内容&#xff1a; 检查危险符号的内容。如果任何零件损坏或缺失&#xff0c;立即联系客服部门。 保存所有包装材料&#xff0c;以防产品需要返厂。 5 - 安装 本章中 安装一般注意 安装PC软件 确保通风 接地C-…

LeetCode --- 132双周赛

题目列表 3174. 清除数字 3175. 找到连续赢 K 场比赛的第一位玩家 3176. 求出最长好子序列 I 3177. 求出最长好子序列 II 一、清理数字 这题直接根据题目&#xff0c;进行模拟即可&#xff0c;大体的思路是遍历字符串&#xff0c;遇到字母就加入答案&#xff0c;遇到数字就…

网络协议四

一、云中网络 物理机的劣势&#xff1a; 1&#xff09;一旦需要扩容 CPU、内存、硬盘&#xff0c;都需要去机房手动弄&#xff0c;非常麻烦 2&#xff09;采购的机器往往动不动几百 G 的内存&#xff0c;而每个应用往往可能只需要 4 核 8G 3&#xff09;一台机器&#xff0c;…

怎么改变图片分辨率dpi数值?图片改分辨率的在线技巧

在上传图片的时候除了图片大小、尺寸等要求之外&#xff0c;修改图片分辨率也是比较常见的一个问题&#xff0c;需要将图片按照平台的要求修改完成后才可以正常使用。当遇到图片dpi的数值不满足使用需求的时候&#xff0c;有什么方法能够更加快捷的修改图片dpi呢&#xff1f;今…

从零开始利用MATLAB进行FPGA设计(七)固化程序

FPGA开发板&#xff1a;AX7020&#xff1b;Xilinx 公司的 Zynq7000 系列的芯片XC7Z020-2CLG400I&#xff0c;400引脚 FBGA 封装。 HARDWARE PLATFORM在2019以后的vivado中已经没有了。本期实际上已经与MATLAB无关&#xff0c;主要介绍通过VITIS等方法进行程序固化。 目录 ZY…

Github 2024-06-13 Go开源项目日报Top10

根据Github Trendings的统计,今日(2024-06-13统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目10TypeScript项目1Shell项目1多存储文件列表/WebDAV程序 创建周期:1265 天开发语言:Go协议类型:GNU Affero General Public License v…

linux安装dgl

1.DGL官网、选择与自己cuda、python版本匹配的dgl的whl文件CUDA11.8、python10并下载 2.用pip install运行 pip install /home/u2023170749/download/dgl-2.2.0cu118-cp310-cp310-manylinux1_x86_64.whl

git提交错了?别慌,直接删除提交记录

git revert 和git reset &#xff01;这两个命令都有撤销操作的功能&#xff01;哪一个可以删除提提交记录&#xff1f;&#xff1f;&#xff1f; 使用git revert撤销提交 revert的英文释义是回复、恢复&#xff08;到原来的状态&#xff09; 作用 git revert 是 Git 中用于撤…

如何通过SOLIDWORKS教育版提高学生技能培养未来人才?

在当今这个科技日新月异的时代&#xff0c;掌握先进的数字化工具已经成为了一项需备的技能。作为一款功能强大的3D CAD软件&#xff0c;SOLIDWORKS教育版正是一个帮助学生提升技能、培养未来人才的重要工具。那么&#xff0c;如何通过SOLIDWORKS教育版提高学生技能呢&#xff1…

全方位·多层次·智能化,漫途水库大坝安全监测方案

党的十九届五中全会提出&#xff0c;到2025年前&#xff0c;完成新出现病险水库的除险加固&#xff0c;配套完善重点小型水库雨水情和安全监测设施&#xff0c;实现水库安全鉴定和除险加固常态化。 加快推进小型水库除险加固。加快构建气象卫星和测雨雷达、雨量站、水文站组成…