代码随想录算法训练营刷题复习3:动态规划——子序列问题

子序列问题

包含四个子问题:子序列(不连续)、子序列(连续)、编辑距离、回文

子序列(不连续)

  1. 300.最长递增子序列
    定义dp数组,问什么dp的定义就设什么,
    更新dp[i]的值,两层循环,第二层循环遍历i之前出现过的元素
  2. 1143.最长公共子序列
    做题的时候能找到思路,有些小细节忽略掉但是能在写的过程中找出来改正
  3. 1035.不相交的线
    印象很深刻,主要是把这个题的问法换一种(换成最长相等元素子序列),差不多是上面俩题的结合体(主要是第二个题的代码思路,第一个题的判断条件)

300.最长递增子序列

class Solution {
public:int lengthOfLIS(vector<int>& nums) {vector<int> dp(nums.size(),1);int result=0;for(int i=0;i<nums.size();i++) {for(int j=0;j<i;j++) {if(nums[j]<nums[i])dp[i] = max(dp[j]+1,dp[i]);}if(result < dp[i])result = dp[i];}return result;}
};

1143.最长公共子序列

class Solution {
public:int longestCommonSubsequence(string text1, string text2) {//声明dp数组的大小时,忽略了i-1 j-1导致越界的问题,后面发现改正了vector<vector<int>> dp(text1.size()+1,vector<int>(text2.size()+1,0));int result=0;//考虑 i-1 j-1这个下标不能越界问题,i和j下标都是从1开始,for(int i=1;i<=text1.size();i++) {for(int j=1;j<=text2.size();j++) {
//                对于字符串来说,首元素下标仍然为0,以下元素比对时需要用i-1if(text1[i-1]==text2[j-1])dp[i][j] = max(dp[i-1][j-1]+1,dp[i][j]);elsedp[i][j] = max(dp[i-1][j],dp[i][j-1]);if(result<dp[i][j])result = dp[i][j];}}return result;}
};

1035.不相交的线
上面俩题的结合体(主要是第二个题的代码思路,第一个题的判断条件)
印象很深刻,主要是把这个题的问法换一种(换成最长相等元素子序列)

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

子序列(连续)

  1. 674.最长连续递增序列
  2. 718.最长重复子数组
  3. 53.最大子序和

674.最长连续递增序列

class Solution {
public:int findLengthOfLCIS(vector<int>& nums) {if(nums.size()<=1)return nums.size();vector<int> dp(nums.size(),1);int res=0;for(int i=1;i<nums.size();i++) {if(nums[i] > nums[i-1])dp[i] = max(dp[i-1]+1,dp[i]);if(res<dp[i])res = dp[i];}return res;}
};

718.最长重复子数组

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

53.最大子序和

dp更新的逻辑:max(dp[i-1]+nums[i], nums[i])看继承这个值与从这个值重新开始哪个更值

class Solution {
public:int maxSubArray(vector<int>& nums) {vector<int> dp(nums.size(),0);dp[0] = nums[0];int res=nums[0];for(int i=1;i<nums.size();i++) {dp[i] = max(dp[i-1]+nums[i], nums[i]);if(res < dp[i])res = dp[i];}return res;}
};

编辑距离

这个系列的题,定义dp数组的时候都需要多出来一行一列并且需要进行初始化。

  1. 392.判断子序列
  2. 115.不同的子序列
    这个题还需要再复习。
  3. 583.两个字符串的删除操作
  4. 72.编辑距离

392.判断子序列

class Solution {
public:bool isSubsequence(string s, string t) {if(s.size()==0)return true;else if(t.size()==0)return false;//原本想把dp数组设置为bool类型,但是想不出后面怎么做了//转换一下思想,把他转化为t字符串与s字符串的公共元素的个数,最后比对是否公共元素个数为s字符串的长度,返回对应值就可vector<vector<int>> dp(s.size()+1, vector<int>(t.size()+1,false));for(int i=1;i<=s.size();i++) {for(int j=1;j<=t.size();j++) {if(s[i-1] == t[j-1]) {dp[i][j]=dp[i-1][j-1]+1;}else {dp[i][j] = dp[i][j-1];   //如果不是的话,就"删除"t当前这个元素,继承上一个元素值}}}if(dp[s.size()][t.size()]==s.size())return true;elsereturn false;}
};

115.不同的子序列
这个题还是要复习

class Solution {
public:int numDistinct(string s, string t) {// unsigned long longvector<vector<unsigned long long>> dp(s.size()+1,vector<unsigned long long>(t.size()+1, 0));for(int i=0;i<=s.size();i++) dp[i][0]=1;for(int i=1;i<=s.size();i++) {for(int j=1;j<=t.size();j++) {if(s[i-1] == t[j-1]) {//①用s[i-1]  +  ②不用s[i-1]dp[i][j] = dp[i-1][j-1] + dp[i-1][j];}else {//到这里走不了了,继承s的上一个下标对应的dp值 只修改idp[i][j] = dp[i-1][j];}}}return dp[s.size()][t.size()];}
};

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

class Solution {
public:int minDistance(string word1, string word2) {if(word1.size()==0)return word2.size();else if(word2.size()==0)return word1.size();//因为对dp第0行和第0列进行了初始化,所以不需要将其他值初始化为INT_MAX,赋值0就可以了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][j] = min(dp[i-1][j]+1,dp[i][j-1]+1);}}}return dp[word1.size()][word2.size()];}
};

72.编辑距离

class Solution {
public:int minDistance(string word1, string word2) {vector<vector<int>> dp(word1.size()+1, vector<int>(word2.size()+1,0));for(int i=0;i<=word1.size();i++) {dp[i][0]=i;}for(int j=0;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][j] = min(dp[i-1][j-1],min(dp[i-1][j],dp[i][j-1]))+1;}}}return dp[word1.size()][word2.size()];}
};

回文

  1. 647.回文子串
    这里虽然也用二维dp数组,但是不需要对数组的大小+1,因为这个dp数组的含义和上面编辑距离类型的dp含义不同。
    遇到元素相同时,根据下标的间隔大小分两种情况,在得到dp[i][j]为true的时候 result++;
  2. 516.最长回文子序列
    dp数组中,i 和 j 的遍历顺序分别为 i从底到头、j从i到尾,dp数组的对角线元素初始化为1,直接把上一题的元素下标差给限定了。

647.回文子串
遇到元素相同时,根据下标的间隔大小分两种情况,在得到dp[i][j]为true的时候 result++;

class Solution {
public:int countSubstrings(string s) {if(s.size()<=1)return s.size();vector<vector<bool>> dp(s.size(),vector<bool>(s.size(),false));int result=0;for(int i=s.size()-1;i>=0;i--) {for(int j=i;j<s.size();j++) {if(s[i]==s[j]) {if(j-i<=1) {dp[i][j]=true;result++;}else {if(dp[i+1][j-1]) {dp[i][j] = true;result++;}}}}}return result;}
};

516.最长回文子序列
dp数组中,i 和 j 的遍历顺序分别为 i从底到头、j从i到尾,dp数组的对角线元素初始化为1,直接把上一题的元素下标差给限定了。

class Solution {
public:int longestPalindromeSubseq(string s) {if(s.size()<=1)return s.size();vector<vector<int>> dp(s.size(),vector<int>(s.size(),0));for(int i=0;i<s.size();i++) {dp[i][i]=1;}for(int i=s.size()-1;i>=0;i--) {for(int j=i+1;j<s.size();j++) {if(s[i]==s[j]) {dp[i][j] = dp[i+1][j-1]+2;}else {dp[i][j] = max(dp[i+1][j],dp[i][j-1]);}}}return dp[0][s.size()-1];}
};

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

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

相关文章

力扣148. 排序链表

给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 示例 1&#xff1a; 输入&#xff1a;head [4,2,1,3] 输出&#xff1a;[1,2,3,4] 示例 2&#xff1a; 输入&#xff1a;head [-1,5,3,4,0] 输出&#xff1a;[-1,0,3,4,5] 示例 3&…

23 华三(自动获取的IP地址)

华三交换机 DHCP 配置 #version 7.1.070, Alpha 7170 //设备的版本信息 #sysname sw1 //修改设备的名字 #irf mac-address persistent timerirf auto-update enableundo irf link-delayirf member 1 priority 1#dhcp enable //开启DHCP 服务dhcp server forbidden-ip 192.168.…

.net 调用海康SDK的常用操作封装

&#x1f4e2;欢迎点赞 &#xff1a;&#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如有错误敬请指正&#xff0c;赐人玫瑰&#xff0c;手留余香&#xff01;&#x1f4e2;本文作者&#xff1a;由webmote 原创&#x1f4e2;作者格言&#xff1a;新的征程&#xff0c;我们面对的不仅…

2024/6/16周报

文章目录 摘要Abstract文献阅读题目问题本文贡献方法aGNN输入和输出模块嵌入模块编码器和解码器模块&#xff1a;支持多头注意的GCN多头自注意力机制GCN模型解释&#xff1a;SHAP 案例研究地下水流动与污染物运移模型研究场景设计 数据集实验结果 代码复现结论 摘要 本周阅读了…

whisper 模型源码解读

whisper官方源码 whisper 模型官方代码&#xff1a;https://github.com/openai/whisper/blob/main/whisper/model.py &#xff1b;注释如下 import base64 import gzip from dataclasses import dataclass from typing import Dict, Iterable, Optionalimport numpy as np impo…

java设计模式和面向对象编程思想

Java设计模式和面向对象编程思想是软件开发中的核心概念&#xff0c;对于构建可维护、可扩展的软件系统至关重要。下面是对这两个主题的知识点总结&#xff1a; 面向对象编程&#xff08;OOP&#xff09;思想 封装&#xff1a;将数据&#xff08;属性&#xff09;和操作这些数据…

享元和代理模式

文章目录 享元模式1.引出享元模式1.展示网站项目需求2.传统方案解决3.问题分析 2.享元模式1.基本介绍2.原理类图3.外部状态和内部状态4.类图5.代码实现1.AbsWebSite.java 抽象的网站2.ConcreteWebSite.java 具体的网站&#xff0c;type属性是内部状态3.WebSiteFactory.java 网站…

CSS从入门到精通——动画:CSS3动画执行次数和逆向播放

目录 任务描述 相关知识 动画执行次数 动画反向播放 编程要求 任务描述 本关任务&#xff1a;用 CSS3 实现loading效果。效果图如下&#xff1a; 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;1.动画执行次数&#xff0c;2.动画反向播放。 需要实现的效…

Go 的 netpoll 如何避免洪泛攻击

Go 的 netpoll&#xff08;网络轮询器&#xff09;组件在其网络库中扮演了一个关键角色&#xff0c;它用来高效地处理大量的网络事件&#xff0c;特别是在高并发环境下。 然而&#xff0c;防止洪泛攻击&#xff08;如 SYN Flood、UDP Flood&#xff09;并不仅仅是 netpoll 本身…

持续总结中!2024年面试必问 20 道并发编程面试题(九)

上一篇地址&#xff1a;持续总结中&#xff01;2024年面试必问 20 道并发编程面试题&#xff08;八&#xff09;-CSDN博客 十七、请解释什么是Callable和FutureTask。 Callable和FutureTask是Java并发API中的重要组成部分&#xff0c;它们用于处理可能产生结果的异步任务。 …

Oracle中select取值后的字符串处理

取一对括号中间内容 SELECT SUBSTR(column_name, INSTR(column_name, () 1, INSTR(column_name, )) - INSTR(column_name, () - 1) AS content_between_parentheses FROM table_name; 某字符值中abc之后def之前部分 SELECTSUBSTR(your_column, INSTR(your_column, abc) LEN…

R调用Taxonkit展示系统发育信息

Introduction TaxonKit是一个用于处理生物分类学数据的命令行工具。 它的主要功能是处理NCBI的生物分类学数据&#xff0c;包括对分类单元&#xff08;如物种、属、科等&#xff09;的查找、分类单元的上下位关系查询、分类单元名称的标准化等。 为了方便R社区用户&#xff0…

Spring-web-HttpServletRequest

在spring mvc中&#xff0c;有2种方法获取当前http请求的request&#xff0c;分别如下 方式1&#xff1a; spring mvc将当前request从抽象类FrameworkServlet的processRequest方法中放进去&#xff0c;然后我们通过下面代码拿出来 HttpServletRequest request ((ServletRequ…

【计算机组成原理】指令系统考研真题详解之拓展操作码!

计算机组成原理&#xff1a;指令系统概述与深入解析 1. 指令系统概述 计算机软硬件界面的概念 在计算机组成原理中&#xff0c;指令系统扮演着至关重要的角色&#xff0c;它是计算机软硬件界面的核心。软件通过指令与硬件进行通信&#xff0c;硬件根据指令执行相应的操作。指…

装饰者模式(设计模式)

装饰模式就是对一个类进行装饰&#xff0c;增强其方法行为&#xff0c;在装饰模式中&#xff0c;作为原来的这个类使用者还不应该感受到装饰前与装饰后有什么不同&#xff0c;否则就破坏了原有类的结构了&#xff0c;所以装饰器模式要做到对被装饰类的使用者透明&#xff0c;这…

如何解决javadoc一直找不到路径的问题?

目录 一、什么是javadoc二、javadoc为什么会找不到路径三、如何解决javadoc一直找不到路径的问题 一、什么是javadoc Javadoc是一种用于生成Java源代码文档的工具&#xff0c;它可以帮助开发者生成易于阅读和理解的文档。Javadoc通过解析Java源代码中的注释&#xff0c;提取其…

英语角情景设计方案

背景介绍 在一个充满活力的清晨&#xff0c;项目团队汇集在线上会议中&#xff0c;准备开始他们定期的项目审查会议。团队成员不仅包括项目经理&#xff08;PM&#xff09;、客户代表&#xff0c;还有会计&#xff08;AM&#xff09;、设计师、前端开发者、后端开发者以及测试…

【CSS】background-size属性的作用是什么,怎么使用

background-size属性的作用&#xff1a; background-size属性在CSS中用于设置背景图像的尺寸。在CSS3之前&#xff0c;背景图片的尺寸是由图片的实际尺寸决定的。而在CSS3中&#xff0c;background-size属性允许我们规定背景图片的尺寸&#xff0c;这使得我们能够在不同的环境…

python命令行参数异常处理的方法:Exception getopt.GetoptError异常

一. 简介 前一篇文章学习了 针对 python的命令行参数进行处理时&#xff0c;提供的模块: getopt模块。文章如下&#xff1a; python3的基本语法&#xff1a;命令行参数-CSDN博客 本文继续学习 getopt模块的一个方法 getopt.GetoptError。 二. python命令行参数&#xff1a…

【Python】理解『下采样』:原理与应用

是你多么温馨的目光 教我坚毅望着前路 叮嘱我跌倒不应放弃 没法解释怎可报尽亲恩 爱意宽大是无限 请准我说声真的爱你 &#x1f3b5; Beyond《真的爱你》 在数字信号处理、图像处理和机器学习中&#xff0c;下采样&#xff08;Downsampling&#xff09;是…