代码随想录算法训练营Day55 | 583.两个字符串的删除操作、72.编辑距离

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

最开始想到的是基于最长公共子序列的写法:删除公共子序列以外的字符,两个字符串就相同了

int minDistance0(string word1, string word2) {int n = word1.size();int m = word2.size();vector<vector<int>> dp(n + 1, vector<int>(m + 1, 0));for (int i = 1; i <= n; ++i) {for (int j = 1; j <= m; ++j) {if (word1[i - 1] == word2[j - 1])dp[i][j] = dp[i - 1][j - 1] + 1;elsedp[i][j] = std::max(dp[i][j - 1], dp[i - 1][j]); }}// 删除最长公共子序列以外的字符return n + m - 2 * dp[n][m];
}

 另一种基于题意定义DP数组的写法:

题目求需要进行删除的最小操作数,那么就将DP数组定义为目前的最小删除次数

1、DP数组定义: dp[i][j] 表示以word2[j - 1] 为结尾的子串和 word1[i - 1] 为结尾的子串达到相同需要的最小删除操作次数

2、DP数组初始化:dp[0][0]初始化为0,其余首列与首行元素初始化为i / j(有 i / j 个字符的字符串与一个空字符串达到相同需要进行 i / j 次删除操作)

3、递推公式

        · 当word1[i - 1] == word2[j - 1]时,不需要进行删除操作:

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

        · 当word1[i - 1] != word2[j - 1]时,dp[i][j]可以由三个方向取最小转移得到:

                方向1——dp[i][j - 1],在此基础上删除 word1[i - 1]

                方向2——dp[i - 1][j],在此基础上删除 word2[j - 1]

                方向3——dp[i - 1][j - 1],在此基础上删除 word1[i - 1] 和 word2[j - 1]

            最后的递推公式:dp[i][j] = min(dp[i - 1][j - 1] + 2, min(dp[i][j - 1] + 1, dp[i - 1][j] + 1))

4、遍历顺序:i 依赖 i - 1,j 依赖 j - 1,所以从左向右从上向下遍历

int minDistance(string word1, string word2) {// dp[i][j]表示达到相同需要的最小删除操作次数vector<vector<int>> dp(word1.size() + 1, vector<int>(word2.size() + 1, 0));// 除dp[0][0]外,dp[i][0]和dp[0][j]初始化为i/jfor (int i = 1; i <= word1.size(); ++i)dp[i][0] = i;for (int j = 1; j <= word2.size(); ++j)dp[0][j] = j;for (int i = 1; i <= word1.size(); ++i) {for (int j = 1; j <= word2.size(); ++j) {if (word1[i - 1] == word2[j - 1])dp[i][j] = dp[i - 1][j - 1];// 三个方向取最小值elsedp[i][j] = std::min(dp[i - 1][j - 1] + 2, std::min(dp[i][j - 1] + 1, dp[i - 1][j] + 1));}}return dp[word1.size()][word2.size()];
}

72.编辑距离

这题仍然是根据题意定义DP数组,重点是理清楚删除、替换、插入三种操作的状态转移

1、DP数组定义: dp[i][j] 表示以 word1[i - 1] 为结尾的子串想要达到与 word2[j - 1] 为结尾的子串相同,需要的最小编辑次数

2、DP数组初始化:dp[0][0]初始化为0,其余首列与首行元素初始化为i / j(有 i / j 个字符的字符串与一个空字符串达到相同需要进行 i / j 次删除操作)

3、递推公式

        · 当word1[i - 1] == word2[j - 1]时,不需要进行编辑操作:

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

        · 当word1[i - 1] != word2[j - 1]时,dp[i][j]可以由三种操作取最小转移得到:

                删除 —— 将word[i - 1]删除,在 dp[i - 1][j] 的基础上+1,

                替换 —— 将 word1[i - 1] 替换为 word2[j - 1],在 dp[i - 1][i - 1] 的基础上+1

                插入 —— 将一个等于 word2[j - 1] 的值插在原先word1[i - 1]的位置上,在 dp[i][j - 1] 的基础上+1

            最后的递推公式:dp[i][j] = min(dp[i - 1][j] + 1, min(dp[i - 1][j - 1] + 1, dp[i][j - 1] + 1))

4、遍历顺序:i 依赖 i - 1,j 依赖 j - 1,所以从左向右从上向下遍历

int minDistance(string word1, string word2) {// dp[i][j]表示达到相同需要的最小编辑操作次数vector<vector<int>> dp(word1.size() + 1, vector<int>(word2.size() + 1, 0));for (int i = 1; i <= word1.size(); ++i)dp[i][0] = i;for (int j = 1; j <= word2.size(); ++j)dp[0][j] = j;for (int i = 1; i <= word1.size(); ++i) {for (int j = 1; j <= word2.size(); ++j) {if (word1[i - 1] == word2[j - 1])dp[i][j] = dp[i - 1][j - 1];else {// 删除:dp[i - 1][j] + 1		(在dp[i - 1][j] + 1的基础上删除word[i - 1])// 替换:dp[i - 1][j - 1] + 1	(在dp[i - 1][i - 1]的基础上将word1[i - 1]替换为word2[j - 1])// 插入:dp[i][j - 1] + 1		(在dp[i][j - 1]的基础上插入一个等于word2[j - 1]的值)dp[i][j] = std::min(dp[i - 1][j] + 1, std::min(dp[i - 1][j - 1] + 1, dp[i][j - 1] + 1));}}}return dp[word1.size()][word2.size()];
}

编辑距离总结

这类题目做多了还是能找到些套路的:

1、DP数组定义

        · DP数组的定义一般是题目要求什么就定义成什么,

        · dp[i][j] 一般表示的是以 word1[i - 1] 为结尾的子串和 word2[j - 1] 为结尾的子串

2、DP数组初始化:结合题意,一般首行和首列的初始化最为重要

3、递推公式

        分析状态转移可以分为“基础”“新增”两部分:

        · 基础:继承之前的状态,如果当前值匹配一般只要进行这步操作

        · 新增:在之前状态的基础上增加操作时新增的值,如果当前值不匹配一般需要额外进行这步操作

4、遍历顺序:结合题意,一般是 i 依赖 i - 1,j 依赖 j - 1,所以大部分情况是从左向右从上向下遍历

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

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

相关文章

小文件问题及GlusterFS的瓶颈

01海量小文件存储的挑战 为了解决海量小文件的存储问题&#xff0c;必须采用分布式存储&#xff0c;目前分布式存储主要采用两种架构&#xff1a;集中式元数据管理架构和去中心化架构。 (1)集中式元数据架构&#xff1a; 典型的集中式元数据架构的分布式存储有GFS&#xff0…

【深度学习笔记】7_1 优化与深度学习

注&#xff1a;本文为《动手学深度学习》开源内容&#xff0c;部分标注了个人理解&#xff0c;仅为个人学习记录&#xff0c;无抄袭搬运意图 7.1 优化与深度学习 本节将讨论优化与深度学习的关系&#xff0c;以及优化在深度学习中的挑战。在一个深度学习问题中&#xff0c;我们…

2023年第三届中国高校大数据挑战赛(第一场)A题思路

竞赛时间 &#xff08;1&#xff09;报名时间&#xff1a;即日起至2024年3月8日 &#xff08;2&#xff09;比赛时间&#xff1a;2024年3月9日8:00至2024年3月12日20:00 &#xff08;3&#xff09;成绩公布&#xff1a;2024年4月30日前 赛题方向&#xff1a;大数据统计分析 …

202109CSPT4收集卡牌

题意&#xff1a;有 n n n种不同的卡牌,每一次抽卡获得第 i i i种卡牌的概率为 p i pi pi。如果这张卡牌已经获得&#xff0c;就会转化为一枚硬币。可以用 k k k枚硬币交换一张没有获得过的卡。求获得所有种类的牌的概率。 #include<bits/stdc.h> using namespace std; …

SQL 注入攻击 - delete注入

环境准备:构建完善的安全渗透测试环境:推荐工具、资源和下载链接_渗透测试靶机下载-CSDN博客 一、注入原理: 对于后台来说,delete操作通常是将对应的id传递到后台,然后后台会删除该id对应的数据。 如果后台没有对接收到的 id 参数进行充分的验证和过滤,恶意用户可能会…

数据治理实践——YY 直播业务指标治理实践

目录 一、问题背景 1.1 问题场景 1.2 问题小结 二、治理方案 2.1 治理目标 2.2 团队协同&#xff0c;共建规范 2.3 指标管理的定位 2.4 指标管理的目标及思路 2.5 指标管理&#xff0c;规范内容落地 2.6 数仓设计-关联指标维度 2.7 数据报表开发-配置口径说明 2.8 …

StableDiffusion3 官方blog论文研究

博客源地址&#xff1a;Stable Diffusion 3: Research Paper — Stability AI 论文源地址&#xff1a;https://arxiv.org/pdf/2403.03206.pdf Stability.AI 官方发布了Stable diffusion 3.0的论文研究&#xff0c;不过目前大家都沉浸在SORA带来的震撼中&#xff0c;所以这个水…

将props展平传到DOM上

当我们将展平&#xff08;传播&#xff09;的属性设置子组件时&#xff0c;我们会引入风险&#xff0c;因为我们可能会往 HTML 标签上添加它不支持的属性。 坏实践 下面这个例子会在 DOM 元素上增加一个该元素本身不支持的属性flag。 const Sample () > (<Spread flag…

chrome插件chrome.storage数据写入失败QUOTA_BYTES_PER_ITEM quota exceeded

Unchecked runtime.lastError while running storage.set: QUOTA_BYTES_PER_ITEM quota exceeded at Object.callback 在开发浏览器插件的时候&#xff0c;报错提示&#xff1a;超出存储限制&#xff0c;浏览器插件存储官方文档&#xff1a;https://developer.chrome.com/docs…

Linux篇面试题 2024

目录 Java全技术栈面试题合集地址Linux篇1.绝对路径用什么符号表示&#xff1f;当前目录、上层目录用什么表示&#xff1f;主目录用什么表示? 切换目录用什么命令&#xff1f;2.怎么查看当前进程&#xff1f;怎么执行退出&#xff1f;怎么查看当前路径&#xff1f;3.怎么清屏&…

Keras用tf的Strategy()分布式训练时候报XLA错误

We failed to lift variable creations out of this tf.function, so this tf.function cannot be run on XLA. A possible workaround is to move variable creation outside of the XLA compiled function. 最早用的pip -U 安装的keras没注意版本&#xff0c;直接可用。 之…

国外网站,similarweb统计网站流量的原理是什么? 这个统计数据是准确的吗? 有没有 没统计不到的?

标签&#xff1a; SimilarWeb&#xff1b; 国外网站 SimilarWeb 提供网站流量和其他互联网指标的估计&#xff0c;主要用于网站分析、竞争对手分析和市场研究。它如何工作&#xff0c;以及其数据的准确性&#xff0c;是很多人关心的问题。下面是对SimilarWeb统计网站流量原理的…

Golang-channel合集——源码阅读、工作流程、实现原理、已关闭channel收发操作、优雅的关闭等面试常见问题。

前言 面试被问到好几次“channel是如何实现的”&#xff0c;我只会说“啊&#xff0c;就一块内存空间传递数据呗”…所以这篇文章来深入学习一下Channel相关。从源码开始学习其组成、工作流程及一些常见考点。 NO&#xff01;共享内存 Golang的并发哲学是“要通过共享内存的…

【AI辅助研发】-开端:未来的编程范式

编程的四种范式 面向机器编程范式 面向机器编程范式是最原始的编程方式&#xff0c;它直接针对计算机硬件进行操作。程序员需要了解计算机的内部结构、指令集和内存管理等细节。在这种范式下&#xff0c;编程的主要目标是编写能够直接控制计算机硬件运行的机器代码。面向机器…

数据伦理:当大数据遇见道德

随着科技的飞速发展&#xff0c;大数据已经成为了我们生活中不可或缺的一部分。从智能手机到智能家居&#xff0c;从电子商务到医疗保健&#xff0c;大数据无处不在。然而&#xff0c;随着数据的广泛应用&#xff0c;数据伦理问题也逐渐浮出水面。本文将探讨大数据时代下的数据…

redis使用笔记

redis使用笔记 1、Redis简介1.1 含义1.2 功能1.3 特点 2. 常用的数据结构2.1 HASH 3 redis接口定义3.1 redisReply3.2 redisContext3.3 redisCommand 4 实践操作4.1 遇到问题4.1.1 Get哈希的时候返回error4.1.2 长度一直为0&#xff0c;str没法打印&#xff08;未解决&#xff…

uniapp地图围栏代码

UniApp 是一个使用 Vue.js 开发所有前端应用的框架&#xff0c;可以编译到 iOS、Android、H5、以及各种小程序等多个平台。在 UniApp 中实现地图围栏功能&#xff0c;通常需要使用地图服务API。对于大多数地图服务来说&#xff0c;实现围栏功能通常需要以下几个步骤&#xff1a…

java正则表达式概述及案例

前言&#xff1a; 学习了正则表达式&#xff0c;记录下使用心得。打好基础&#xff0c;daydayup! 正则表达式 什么是正则表达式 正则表达式由一些特定的字符组成&#xff0c;代表一个规则。 正则表达式的功能 1&#xff1a;用来校验数据格式是否合规 2&#xff1a;在一段文本…

Android 二维码相关(一)

Android 二维码相关(一) 本篇文章主要记录下android下使用zxing来创建二维码. 1: 导入依赖 api "com.google.zxing:core:3.5.1"2: 创建二维码 创建QRCodeWriter对象 QRCodeWriter qrCodeWriter new QRCodeWriter(); 将文本内容转换成BitMatrix BitMatrix encode …

2024,互联网打工人最终没能逃得过 AI

时间很快就来到了三月份&#xff0c;回首看过去的一年&#xff0c;如果要选择最令人着迷的新技术&#xff0c;那非 ChatGPT 莫属。 从美国的硅谷、华尔街到中国的后厂村、中关村&#xff0c;几乎所有的科技大厂们都在讨论“AIGC”。 既 ChatGPT 之后&#xff0c;几乎每天都有…