力扣72-编辑距离(Java详细题解)

embedded/2024/12/22 10:06:58/

题目链接:力扣72-编辑距离

前情提要:

因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。

dp五部曲。

1.确定dp数组和i下标的含义。

2.确定递推公式。

3.dp初始化。

4.确定dp的遍历顺序。

5.如果没有ac打印dp数组 利于debug。

每一个dp题目如果都用这五步分析清楚,那么这道题就能解出来了。

题目思路:

如果你做过力扣583-两个字符串的删除操作,或者看过我那篇题解,那么做本题会轻松很多。

本题与力扣583不同的就是,本题可以对单词有三种操作,删除、替换、添加。

而力扣583只有一种操作,就是删除。

本题题目要求使word1转化为word2相同所使用的最少操作数。

使用dp五部曲系统分析一下。

1.确定dp数组和i下标的含义。

dp[i] [j] 是指使i - 1结尾的word1和以j - 1为结尾的word2相同所操作的最少次数。

注意这里是以i - 1为结尾,j - 1为结尾。至于为什么要这样设置dp数组看看我这篇题解力扣718-最长重复子数组(Java详细题解)-CSDN博客。

2.确定递推公式。

子序列问题都要考虑word1[i - 1] 是否等于 word2[j - 1]的情况。

  • 相等的情况。

    既然最后结尾的元素相等,那么就要在以前一个为结尾的元素的字符串中操作了。

    所以dp[i] [j] = dp[i - 1] [j - 1];

  • 不相等的情况

    不相等我们就要操作元素了,具体的操作情况有三种。

    1. 删除

    2. 增加

    3. 替换

      其实删除和增加是相互的,你对word1删除使其和word2相同,其实也可以使word2增加使其和word1相同。

      那么肯定有人想我为什么不删然后再加,那么所用的操作数肯定就多了,而且没有意义。

      所以其实这里删除和添加选一个就行了,我这里用的就是删除,具体删除哪个我们不能确定,是由递推公式帮我们确定删除元素多的那个。

      删除的情况就跟力扣583一模一样了就是dp[i] [j] = Math.min(dp[i - 1] [j] + 1,dp[i] [j - 1] + 1);

      替换的话我们就得额外考虑了。

      当我们最后一个元素不相同,需要替换,我们肯定是替换其中的一个使其与另一个相同。所以dp[i] [j] = dp[i - 1] [j - 1] + 1;

      因为我们替换最后一个元素,所以只需要在前一个元素的最少操作数加一即可。

      综上所述:

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

3.dp初始化。

由递推公式可以看出dp[i] [j] 是由dp[i] [j - 1]或者dp[i - 1] [j]或dp[i - 1] [j - 1]推出。

所以在二维dp数组里就由他的上方左方和左上方三个方向推出。

那么起始位置就是第一行和第一列;

dp[i] [0] dp[0] [j] 指的是空串和另一个字符串相同时操作的最少次数。

那么使他们相同的最少操作次数就是让有元素的字符串的元素全部删掉。

所以dp初始化为

java">for(int i = 0;i <= s.length();i ++){dp[i][0] = i;}for(int i = 0;i <= t.length();i ++){dp[0][i] = i;}

4.确定dp的遍历顺序。

由递推公式可以看出dp[i] [j] 是由dp[i] [j - 1]或者dp[i - 1] [j]或dp[i - 1] [j - 1]推出。

所以在二维dp数组里就由他的上方左方和左上方三个方向推出。

所以遍历顺序一定是从左到右,从上到下。

5.如果没有ac打印dp数组 利于debug。

在这里插入图片描述

其实前面的题都是用来铺垫本题,如果前面题理解了,那么做本题不会很难。

这一篇博客就到这了,如果你有什么疑问和想法可以打在评论区,或者私信我。

我很乐意为你解答。那么我们下篇再见!


http://www.ppmy.cn/embedded/115774.html

相关文章

机器学习及其应用领域【金融领域】

机器学习及其应用领域【金融领域】 一、智能投顾与资产配置二、信贷审批与风险评估三、支付与交易安全四、金融欺诈检测五、市场预测与情绪分析六、客户服务与个性化推荐七、面临的挑战与未来趋势八、总结 一、智能投顾与资产配置 智能投顾&#xff1a;通过机器学习技术&#…

微信公众号快速注册并认证小程序流程

目录 一、官方指引二、操作流程1.条件2.限制3.开通入口4.相关规则5.创建流程 使用已认证的公众号来快速申请小程序&#xff0c;可以节省300元的认证费。 一、官方指引 官方指引&#xff1a;http://kf.qq.com/faq/170705YVZFZZ170705eyI7Rr.html 二、操作流程 为方便公众号快…

黑马头条day3-1 素材上传

点击开始上传 没有反应 接口显示200 而且拦截器也能正常工作 检查了minio的读写权限 没有问题 浪费了一下午 最后发现是 cv的时候没有把这一部分接上 当时以为有个类了就没复制上&#xff0c;&#xff0c;&#xff0c;&#xff0c;默认返回的是null 所以没反应 超级折磨

推荐|基于springBoot智能推荐的卫生健康系统设计与实现(源码+论文+数据库)

私信或留言即免费送开题报告和任务书&#xff08;可指定任意题目&#xff09; 目录 一、摘要 二、相关技 三、系统设计 四、数据库设计 五、核心代码 六、论文参考 七、源码获取&#xff1a; 一、摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;…

前端vue-实现富文本组件

1.使用wangeditor富文本编辑器 工具网站&#xff1a;https://www.wangeditor.com/v4/ 下载安装命令&#xff1a;npm i wangeditor --save 成品如下图&#xff1a; 组件实现代码 <template><div><!-- 富文本编辑器 --><div id"wangeditor">…

WordPress建站钩子函数及使用

目录 前言&#xff1a; 使用场景&#xff1a; 一、常用的wordpress钩子&#xff08;动作钩子、过滤器钩子&#xff09; 1、动作钩子&#xff08;Action Hooks&#xff09; 2、过滤器钩子&#xff08;Filter Hooks&#xff09; 二、常用钩子示例 1、添加自定义 CSS 和 JS…

Spring为什么要用三级缓存解决循环依赖?

Spring为什么要用三级缓存解决循环依赖&#xff1f; 1. Spring是如何创建一个bean对象2. Spring三级缓存2.1 一级缓存&#xff1a;单例池&#xff0c;经历过完整bean生命&#xff0c;单例Bean对象2.2 二级缓存&#xff1a;提前暴露的Bean2.3 三级缓存&#xff1a;打破循环 3. S…

Qt (17)【Qt 文件操作 读写保存】

阅读导航 引言一、Qt文件概述二、输入输出设备类三、文件读写类四、文件和目录信息类五、自定义“记事本” 引言 在上一篇文章中&#xff0c;我们学习了Qt的事件处理机制&#xff0c;知道了如何响应用户的操作。但应用程序常常还需要处理文件&#xff0c;比如读写数据。所以&a…