day59 动态规划part16

583. 两个字符串的删除操作

中等
给定两个单词 word1 和 word2 ,返回使得 word1 和 word2 相同所需的最小步数。

每步 可以删除任意一个字符串中的一个字符。

示例 1:

输入: word1 = “sea”, word2 = “eat”
输出: 2
解释: 第一步将 “sea” 变为 “ea” ,第二步将 "eat "变为 “ea”
示例 2:

输入:word1 = “leetcode”, word2 = “etco”
输出:4

方法一:

在这里插入图片描述

方法二:

上述解决方案是套用了「最长公共子序列(LCS)」进行求解,最后再根据 LCS 长度计算答案。

而更加契合题意的状态定义是根据「最长公共子序列(LCS)」的原始状态定义进行微调:定义 f[i][j]f[i][j]f[i][j] 代表考虑 s1s1s1 的前 iii 个字符、考虑 s2s2s2 的前 jjj 个字符(最终字符串不一定包含 s1[i]s1[i]s1[i] 或 s2[j]s2[j]s2[j])时形成相同字符串的最小删除次数。
在这里插入图片描述
在这里插入图片描述

class Solution {public int minDistance(String word1, String word2) {int len1 = word1.length();int len2 = word2.length();//dp[i][j]代表考虑 s1s1s1 的前 iii 个字符、考虑 s2s2s2 的前 jjj 个字符(最终字符串不一定包含 s1[i]s1[i]s1[i] 或 s2[j]s2[j]s2[j])时形成相同字符串的最小删除次数int[][] dp = new int[len1 + 1][len2 + 1];  // 初始化,当其中一个为空字符时,另一个要想变成空字符必须删除 i 次for (int i = 0; i <= len1; i++) { // 注意这里是小于等于,不要弄丢等于dp[i][0] = i;}for (int i = 0; i <= len2; i++) {dp[0][i] = i;}for (int i = 1; i <= len1; i++) {for (int j = 1; j <= len2; j++) {if (word1.charAt(i - 1) == word2.charAt(j - 1)) { // 如果取出的字符相同, 那这俩就不会进行删除操作,次数就不变,等于没取出它们的情况dp[i][j] = dp[i - 1][j - 1];} else { // 如果取出的字符不同, 那就删其中一个字符dp[i][j] = Math.min(dp[i - 1][j] + 1, dp[i][j - 1] + 1);}}}return dp[len1][len2];}
}

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【i】【j】表示使原字符串在【0,i-1】和【0,j-1】区间相同需要的最小操作数,侧面反应,经过dp后,即dp数组被赋值后,所赋值的区间内字符串完全相同,举个例子,dp【4】【5】 = 5,说明在区间【0,3】和【0,4】两字符串完全相同,需要的最小操作数为5。简言之,dp过后区间内字符串相同。

此时我们在回过头来看递推公式,如果i-1和j-1对应的字符相同,此时无须操作,继承将【0,i-2】和【0,j-2】变成相同的最小操作数,即dp【i】【j】 = dp【i-1】【j-1】,注意此时【0,i-2】和【0,j-2】区间经过操作后字符串完全相同(即使我们没有真的对原字符串进行任何操作);
如果二者不相等,此时一定要对某个字符进行操作(增删改,注意增和删的效果等效),假设我们删除i-1对应的元素,此时相同字符区间由【0,i-1】和【0,j-1】变成了【0,i-2】和【0,j-1】(注意此时该区间内的dp已经被赋值,说明该区间内的字符串已经完全相同),操作数也在此基础上加一,删j-1同理;我们考虑改变其中一个元素使二者相同,则我们在区间【0,i-2】和【0,j-2】的基础上加一即可。

总而言之,dp过后的区间内,其字符串已经完全相同,可以直接拿过来用。
在这里插入图片描述

class Solution {public int minDistance(String word1, String word2) {int len1 = word1.length();int len2 = word2.length();int[][] dp = new int[len1 + 1][len2 + 1];for (int i = 0; i <= len1; i++) {dp[i][0] = i;}for (int j = 0; j <= len2; j++) {dp[0][j] = j;}for (int i = 1; i <= len1; i++) {for (int j = 1; j <= len2; j++) {if (word1.charAt(i - 1) == word2.charAt(j - 1)) {dp[i][j] = dp[i - 1][j - 1];} else {dp[i][j] = Math.min(Math.min(dp[i][j - 1] + 1, dp[i - 1][j] + 1), dp[i - 1][j - 1] + 1);}}}return dp[len1][len2];}
}

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

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

相关文章

Android Telephony框架

目录 一、简介二、应用层(Application)三、框架层(Framework)四、本地 RIL 层(RIL)五、驱动层(Modem)六、整体框架 一、简介 无论手机发展到如何智能的程度&#xff0c;最关键和重要的功能仍然是通讯&#xff0c;具体来说就是打电话、发短信、上网功能的使用。而整个 Android …

大模型之路2:继续趟一条小路

继续趟一条小路&#xff0c;可谓是充满了曲折&#xff0c;当然&#xff0c;必不可少的还是坑。 吐槽 看过的喷友&#xff0c;其实你看完以后&#xff0c;大概率也就是和我一起骂骂街&#xff0c;因为....我也的确没理清楚。 我也不知道做错了什么&#xff0c;就是运行不过去…

1.JavaEE进阶篇 - 为什么要学习SpringBoot呢?

文章目录 1.为什么要学框架&#xff1f;2.框架的优点展示(SpringBoot VS Servlet)2.1 Servlet 项⽬开发2.1.1 创建项⽬2.1.2 添加引⽤2.1.3 添加业务代码2.1.4 运⾏项⽬(配置tomcat)2.1.5 Maven配置2.1.5.1修改本地Maven仓库地址2.1.5.2 配置settings.xml文件2.1.5.3项目 本地仓…

python file怎么打开

Python open() 方法用于打开一个文件&#xff0c;并返回文件对象&#xff0c;在对文件进行处理过程都需要使用到这个函数&#xff0c;如果该文件无法被打开&#xff0c;会抛出 OSError。 注意&#xff1a;使用 open() 方法一定要保证关闭文件对象&#xff0c;即调用 close() 方…

税务知识竞赛活动方案

为了提高税务工作人员的业务技能和知识&#xff0c;现在全市范围开展税务知识竞赛&#xff0c;希望通过“以赛促学”&#xff0c;在税务系统掀起一场税务知识学习热潮。下面是本次竞赛的活动方案。 1、第一轮&#xff1a;争分夺秒。选择题或判断题&#xff0c;每位参赛选手按编…

windows部署Jenkins并远程部署tomcat

目录 1、Jenkins官网下载Jenkins 2、安装Jenkins 3、修改Home directory 4、插件安装及系统配置 5、Tomcat安装及配置 5.1、修改配置文件,屏蔽以下代码 5.2、新增登录用户 5.3、编码格式修改 5.4、启动tomcat 6、Jenkins远程部署war包 6.1、General配置 6.2、Sourc…

如何用 C++ 部署深度学习模型?

深度学习模型在诸多领域如图像识别、自然语言处理、语音识别等展现出强大的应用潜力。然而&#xff0c;模型训练与实际部署是两个不同的环节&#xff0c;许多开发者在使用Python进行模型训练后&#xff0c;出于性能、集成便利性或特定平台要求等因素&#xff0c;会选择使用C进行…

数字未来:探索 Web3 的革命性潜力

在当今数字化的时代&#xff0c;Web3作为互联网的新兴范式正逐渐崭露头角&#xff0c;引发了广泛的关注和探讨。本文将深入探索数字未来中Web3所蕴含的革命性潜力&#xff0c;探讨其对社会、经济和技术的深远影响。 1. Web3&#xff1a;数字世界的下一个阶段 Web3是一个正在崛…

在java开发中平方怎么表示?平方表示的方法有哪几种?

在java开发中平方怎么表示&#xff1f;平方表示的方法有哪几种&#xff1f; 在我们计算一个数的几次方的时候。我们按照课堂中老师的教法就是在一个数的右上角写上一个小小的数字用来表示一个数的几次方&#xff0c;那么大家知道“在java开发中平方怎么表示吗&#xff1f;“和…

Redis 和 Mysql 数据库数据如何保持一致性

1. 前言 我们在实际项目中经常会使用到Redis缓存用来缓解数据库压力&#xff0c;但是当更新数据库时&#xff0c;如何保证缓存及数据库一致性&#xff0c;一般我们采用延时双删策略。 目前系统中常用的做法是一个查询接口&#xff0c;先查询Redis&#xff0c;如果不存在则查询…

【笔记】即时通讯设计

记录一下最近对im功能的设计 写扩散 1&#xff09;遍历群聊的成员并发送消息&#xff1b;2&#xff09;群聊所有人都存一份&#xff1b;3&#xff09;查询每个成员的在线状态&#xff1b;4&#xff09;在线的实时推送。 读扩散 1&#xff09;遍历群聊的成员并发送消息&#x…