【算法挨揍日记】day40——712. 两个字符串的最小ASCII删除和、718. 最长重复子数组

 712. 两个字符串的最小ASCII删除和

712. 两个字符串的最小ASCII删除和

题目描述: 

给定两个字符串s1 和 s2,返回 使两个字符串相等所需删除字符的 ASCII 值的最小和 

解题思路:

算法思路:
正难则反:求两个字符串的最⼩ ASCII 删除和,其实就是找到两个字符串中所有的公共⼦序列
⾥⾯, ASCII 最⼤和。
因此,我们的思路就是按照「最⻓公共⼦序列」的分析⽅式来分析。
1. 状态表⽰:
dp[i][j] 表⽰: s1 [0, i] 区间以及 s2 [0, j] 区间内的所有的⼦序列中,公
共⼦序列的 ASCII 最⼤和。
2. 状态转移⽅程:
对于 dp[i][j] 根据「最后⼀个位置」的元素,结合题⽬要求,分情况讨论:
i. s1[i] == s2[j] 时:应该先在 s1 [0, i - 1] 区间以及 s2 [0, j
- 1] 区间内找⼀个公共⼦序列的最⼤和,然后在它们后⾯加上⼀个 s1[i] 字符即可。
此时 dp[i][j] = dp[i - 1][j - 1] + s1[i]
ii. 当 s1[i] != s2[j] 时:公共⼦序列的最⼤和会有三种可能:
s1 [0, i - 1] 区间以及 s2 [0, j] 区间内:此时 dp[i][j] =
dp[i - 1][j]
s1 [0, i] 区间以及 s2 [0, j - 1] 区间内:此时 dp[i][j] =
dp[i][j - 1]
s1 [0, i - 1] 区间以及 s2 [0, j - 1] 区间内:此时 dp[i][j]
= dp[i - 1][j - 1]
但是前两种情况⾥⾯包含了第三种情况,因此仅需考虑前两种情况下的最⼤值即可。
综上所述,状态转移⽅程为:
s1[i - 1] == s2[j - 1] 时, dp[i][j] = dp[i - 1][j - 1] + s1[i]
s1[i - 1] != s2[j - 1] 时, dp[i][j] = max(dp[i - 1][j], dp[i][j
- 1])
3. 初始化:
a. 「空串」是有研究意义的,因此我们将原始 dp 表的规模多加上⼀⾏和⼀列,表⽰空串。
b. 引⼊空串后,⼤⼤的「⽅便我们的初始化」。
c. 但也要注意「下标的映射」关系,以及⾥⾯的值要保证「后续填表是正确的」。
s1 为空时,没有⻓度,同理 s2 也是。因此第⼀⾏和第⼀列⾥⾯的值初始化为 0 即可保证
后续填表是正确的。
4. 填表顺序:
「从上往下」填每⼀⾏,每⼀⾏「从左往右」。
5. 返回值:
根据「状态表⽰」,我们不能直接返回 dp 表⾥⾯的某个值:
i. 先找到 dp[m][n] ,也是最⼤公共 ASCII 和;
ii. 统计两个字符串的 ASCII 码和 s u m;
iii. 返回 sum - 2 * dp[m][n]

解题代码:

class Solution {
public:int minimumDeleteSum(string s1, string s2) {int m=s1.size();int n=s2.size();vector<vector<int>>dp(m+1,vector<int>(n+1,0));int sum=0;for(int i=0;i<m;i++)sum+=s1[i];for(int i=0;i<n;i++)sum+=s2[i];for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){dp[i][j]=max(dp[i-1][j],dp[i][j-1]);if(s1[i-1]==s2[j-1])dp[i][j]=max(dp[i][j],dp[i-1][j-1]+s1[i-1]);}}return sum-2*dp[m][n];}
};

 718. 最长重复子数组

 
718. 最长重复子数组

题目描述:

给两个整数数组 nums1 和 nums2 ,返回 两个数组中 公共的 、长度最长的子数组的长度 。 

 解题思路:

算法思路:
⼦数组是数组中「连续」的⼀段,我们习惯上「以某⼀个位置为结尾」来研究。由于是两个数组,
因此我们可以尝试:以第⼀个数组的 i 位置为结尾以及第⼆个数组的 j 位置为结尾来解决问
题。
1. 状态表⽰:
dp[i][j] 表⽰「以第⼀个数组的 i 位置为结尾」,以及「第⼆个数组的 j 位置为结尾」公
共的 、⻓度最⻓的「⼦数组」的⻓度。
2. 状态转移⽅程:
对于 dp[i][j] ,当 nums1[i] == nums2[j] 的时候,才有意义,此时最⻓重复⼦数组的
⻓度应该等于 1 加上除去最后⼀个位置时,以 i - 1, j - 1 为结尾的最⻓重复⼦数组的⻓
度。
因此,状态转移⽅程为: dp[i][j] = 1 + dp[i - 1][j - 1]
3. 初始化:
为了处理「越界」的情况,我们可以添加⼀⾏和⼀列, dp 数组的下标从 1 开始,这样就⽆需初
始化。
第⼀⾏表⽰第⼀个数组为空,此时没有重复⼦数组,因此⾥⾯的值设置成 0 即可;
第⼀列也是同理。
4. 填表顺序:
根据「状态转移」,我们需要「从上往下」填每⼀⾏,每⼀⾏「从左往右」。
5. 返回值:
根据「状态表⽰」,我们需要返回 dp 表⾥⾯的「最⼤值」。

解题代码:

class Solution {
public:int findLength(vector<int>& nums1, vector<int>& nums2) {int m=nums1.size();int n=nums2.size();vector<vector<int>>dp(m+1,vector<int>(n+1,0));int ret=0;for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){if(nums1[i-1]==nums2[j-1])dp[i][j]=dp[i-1][j-1]+1;ret=max(ret,dp[i][j]);}}return ret;}
};

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

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

相关文章

2023年兔飞猛进,2024年龙码精神,龙举云兴

一、2023年回顾 从中华传统文化的角度来看&#xff0c;2023年&#xff0c;是一个比较特别的年份。 2023年是癸卯年&#xff0c;这是根据“天干地支”排列而来。2023年是黑兔年&#xff0c;这是一是根据十天支与五行的对应关系&#xff1a;壬癸属水、代表黑色&#xff0c;二是…

进阶学习——Linux系统——程序和进程

目录 一、程序和进程的关系 1.程序 2.进程 2.1线程 2.2协程 3.进程与线程的区别 4.总结 4.1延伸 5.进程使用内存的问题 5.1内存泄漏——Memory Leak 5.2内存溢出——Memory Overflow 5.3内存不足——OOM&#xff08;out of memory&#xff09; 5.4进程使用内存出现…

Numpy基础

目录&#xff1a; 一、简介:二、array数组ndarray&#xff1a;1.array( )创建数组&#xff1a;2.数组赋值和引用的区别&#xff1a;3.arange( )创建区间数组&#xff1a;4.linspace( )创建等差数列&#xff1a;5.logspace( )创建等比数列&#xff1a;6.zeros( )创建全0数组&…

数据库02-06 形式化SQL查询基础

01. 03. 04. 05. 06. 08. 09. 10. 11. 12. 13.

《作家天地》期刊投稿邮箱投稿方式

《作家天地》是国家新闻出版总署批准的正规文学刊物。对各种流派的作品兼收并蓄&#xff0c;力求题材、形式、风格多样化&#xff0c;适用于发表高品质文学学术作品&#xff0c;科研机构的专家学者以及高等院校的师生等。具有原创性的学术理论、工作实践、科研成果和科研课题及…

新手学习易语言中文编程,易语言从入门到精通教学

一、教程描述 本套教程共有100集&#xff0c;并且有大量的课件资料&#xff0c;可能是截止到目前为止&#xff0c;最为全面系统的易语言教程了&#xff0c;其中有些视频是.exe文件&#xff0c;可以下载到本地播放。本套易语言教程&#xff0c;大小14.59G&#xff0c;共有6个压…

Python爬虫实战技巧:如何在爬取过程中动态切换代理IP

目录 前言 第一步&#xff1a;获取代理IP列表 第二步&#xff1a;测试代理IP的可用性 第三步&#xff1a;动态切换代理IP 总结 前言 在进行爬虫开发的过程中&#xff0c;有时候需要使用代理IP来访问目标网站&#xff0c;以避免被封IP或者降低访问频率的限制。本文将介绍如…

集logo生成、图片压缩、裁剪、二维码生成于一体的图片处理工具

今天给大家介绍一款在线图片处理工具&#xff0c;界面简洁、无广告&#xff0c;能进行图片裁剪、压缩、生成二维码&#xff0c;以及处理图片等基础功能。 也可以生成新的图片&#xff0c;包括文字logo等。 地址&#xff1a;画图呀 一、图片裁剪 二、图片压缩 三、生成二维码…

奇技淫巧:如何给项目中的RabbitMQ添加总开关

本文主要分享了如何给项目中的RabbitMQ添加总开关&#xff0c;通过简单配置开/关RabbitMQ。 一、需求背景 SpringBoot项目里使用了RabbitMQ&#xff0c;但某些场景下&#xff0c;不希望项目启动时自动检查RabbitMQ连接 例如&#xff1a; 在开发不需要RabbitMQ的功能过程中&…

LLM 中的长文本问题

近期,随着大模型技术的发展,长文本问题逐渐成为热门且关键的问题,不妨简单梳理一下近期出现的典型的长文本模型: 10 月上旬,Moonshot AI 的 Kimi Chat 问世,这是首个支持 20 万汉字输入的智能助手产品; 10 月下旬,百川智能发布 Baichuan2-192K 长窗口大模型,相当于一次…

three.js Raycaster(鼠标点击选中模型)

效果&#xff1a; 代码&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs" style"border: 1px solid red"></div><div class"box-right"…

【模拟电路】非接触测电笔绘制、电子琴NE555

一、非接触测电笔原理图绘制 二、非接触测电笔PCB绘制 三、电子琴NE555制作过程及元器件选型 四、电子琴NE555原理图绘制 五、电子琴NE555PCB绘制 六、电子琴NE555最终效果 点击跳转 一、非接触测电笔原理图绘制 材料 电池 2032 电池底座 适用电池:CR2032 白色 C964762 NPN三…