代码随想录训练营第54天|LeetCode 392.判断子序列、115.不同的子序列

news2024/11/26 2:40:29

参考

代码随想录

题目一:LeetCode 392.判断子序列

  1. 确定dp数组及其下标的含义
    dp[i][j]:s字符串中0~i字符构成的子串和t字符串中0~j字符构成的子串的最长公共子序列的长度。

  2. 确定递推公式
    dp[i][j]有两个可能的来源:

  • 如果s[i] == t[j],则dp[i][j] = dp[i-1][j-1] + 1
  • 如果s[i] != t[j],则dp[i][j] = max(dp[i-1][j],dp[i][j-1])
  1. 初始化dp数组
    根据递推公式,需要初始化第0行和第0列,代码如下:
 vector<vector<int>> dp(s.size(),vector<int>(t.size(),1));
//初始化
for(int i = 0; i < s.size(); i++){
    if(s[i] != t[0]) dp[i][0] = 0;
    else break;
}
for(int j = 0; j < t.size(); j++){
    if(s[0] != t[j]) dp[0][j] = 0;
    else break;
}
  1. 确定遍历顺序
    两层for循环都是从前往后遍历。

  2. 举例推导dp数组
    在这里插入图片描述
    最长公共子序列的长度为3,等于字符串s的长度,因此返回true。

完整的代码实现如下:

class Solution {
public:
    bool isSubsequence(string s, string t) {
        if(s == "") return true;
        if(t == "") return false;
        vector<vector<int>> dp(s.size(),vector<int>(t.size(),1));
        //初始化
        for(int i = 0; i < s.size(); i++){
            if(s[i] != t[0]) dp[i][0] = 0;
            else break;
        }
        for(int j = 0; j < t.size(); j++){
            if(s[0] != t[j]) dp[0][j] = 0;
            else break;
        }
        //遍历
        for(int i = 1; i < s.size(); i++){
            for(int j = 1; j < t.size(); j++){
                if(s[i] == t[j])
                    dp[i][j] = dp[i-1][j-1] + 1;
                else
                    dp[i][j] = max(dp[i-1][j],dp[i][j-1]);
            }
        }
        return dp.back()[t.size()-1] == s.size();
    }
};

题目二:LeetCode 115.不同的子序列

  1. 确定dp数组下标及其含义
    dp[i][j]:子串1(s字符串中0~i字符构成的子串)得到子串2(t字符串中0~j字符构成的子串)有dp[i][j]中方法。

  2. 确定递推公式

  • 如果s[i] == t[j],则dp[i][j] = dp[i-1][j-1] + dp[i-1][j],其中的dp[i-1][j-1]表示的是在不考虑s[i]和t[j]时在此之前的匹配情况,dp[i-1][j]表示的是不考虑s[i]的匹配情况。例如,s = “bagg”,t = “bag”,则s可以有两种方式得到t。(实在不清楚可以举例推导一下第二个例子)
  • 如果s[i] != t[j],则s[i]对于匹配没有帮助,因此dp[i][i] = dp[i-1][j].
  1. 初始化dp数组
vector<vector<uint64_t>> dp(s.size(),vector<uint64_t>(t.size(),0));
if(s[0] == t[0])    dp[0][0] = 1;
for(int i = 1; i < s.size(); i++)
    if(s[i] == t[0])    dp[i][0] = dp[i-1][0] + 1;
    else    dp[i][0] = dp[i-1][0];
  1. 确定遍历顺序
    两层for循环都是从前往后遍历。

  2. 举例推导dp数组
    在这里插入图片描述
    完整的代码实现如下:

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

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

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

相关文章

内点法求最优潮流和微电网调度(风、光、蓄电池、燃油机)(Matlab实现)

目录 1 概述 2 案例 2.1算例描述 2.2 数据 3 一点小知识 4 Matlab代码实现 1 概述 由于电力系统本身的复杂性,电力潮流优化具有规模大,约束条件多和非线性的特点。通过对最优潮流的求解,最终达到优化已有资源、降低发电厂耗量成本、减少电网线路损耗、提高电力系统输电…

JSON的定义、基本使用、以及和对象之间的相互转换

json的定义与基本使用 <script>//定义jsonvar json{"name" : "张三","age" : "18岁","addr" : ["北京","上海","天津"]}//获取数据console.log(json.age)console.log(json.name)consol…

【算法】可解释机器学习-CAM / Grad_CAM(Datawhale)

可解释机器学习-CAM / Grad_CAM一、CAM1.CAM算法介绍2.CAM的特点3.CAM算法的缺点二、Grad_CAM1.Grad_CAM算法介绍2.Grad_CAM算法优点3.Grad_CAM算法缺点4.Grad_CAM算法的变种1&#xff09;Grad_CAM算法2&#xff09;ScoreCAM算法3&#xff09;LayerCAM算法一、CAM 1.CAM算法介…

jsp+ssm计算机毕业设计高铁售票管理系统【附源码】

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JSPSSM mybatis Maven等等组成&#xff0c;B/S模式 Mave…

stack和queue

stack&#xff1a;https://cplusplus.com/reference/stack/stack/?kwstack 1. stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其删除只能从容器的一端进行 元素的插入与提取操作。 2. stack是作为容器适配器被实现的&#xff0c;容器…

设计模式之命令模式

Command design pattern 命令模式的概念、命令模式的结构、命令模式的优缺点、命令模式的使用场景、命令模式的实现示例、命令模式的源码分析 1、命令模式的概念 命令模式&#xff0c;即将请求封装成一个对象&#xff0c;使发出请求的责任和执行请求的责任分离开。这样两者之间…

App自动化测试【1】Appium的原理解读

1.Appium的架构原理 Appium的架构原理如图所示&#xff0c;由客户端&#xff08;Appium Client&#xff09;和服务器&#xff08;Appium Server&#xff09;两部分组成&#xff0c;客户端与服务器端通过JSON Wire Protocol进行通信。 2.Appium原理解读 客户端Client&#x…

Win10自动更新怎么永久关闭?服务、注册表、组策略、计划任务中全方位设置,永久解决!

Win10自动更新就像打不死的小强&#xff0c;不管怎么关闭&#xff0c;之后还是会自动更新&#xff0c;让不少小伙伴颇为不爽。今天通过4步&#xff0c;在服务、注册表、组策略、计划任务中全方位设置&#xff0c;彻底关闭Win10自动更新&#xff0c;感兴趣的小伙伴不妨试试吧。 …

Python:requirements.txt, environment.yml简介

文章目录简介requirements.txtenvironment.yml小结简介 最近安装了一些从github上clone下载的开源python软件包&#xff0c;经历了许许多多的酸甜苦辣。在python软件包&#xff0c;通常都会包含requirements.txt, environment.yml, setup.py三者之中某些或者全部&#xff0c;一…

11.注解开发依赖注入及管理第三方Bean

1. 注解开发依赖注入 1.1 使用Autowired注解开启自动装配模式 Service public class BookServiceImpl implements BookService {//Autowired&#xff1a;注入引用类型&#xff0c;自动装配模式&#xff0c;默认按类型装配Autowiredprivate BookDao bookDao;public void save(…

【OpenCV+Qt】实现简易视频播放器——支持进度条拖动

OpenCV实现视频播放器&#xff0c;其思路大致就是在线程中使用OpenCV中的VideoCapture循环读取本地视频的每一帧Mat&#xff0c;然后发送到界面转换成QImage进行显示&#xff0c;而进度条拖动则用到了VideoCapture中的set函数&#xff0c;进度条则是使用Qslider&#xff1b;并且…

记录安装 fenics 的问题

因为 fenics 官方更新后可能版本会出现有时效的问题, 所以也记录一下时间. Windows 系统下安装最大的问题 2022-12-19 记录. Windows 系统下本来是想通过 Anaconda 安装 fenics 的, 创建好虚拟环境后, 利用 conda install -c conda-forge fenics 进行安装, 但是直接提示 Pack…

操作系统,计算机网络,数据库刷题笔记14

操作系统&#xff0c;计算机网络&#xff0c;数据库刷题笔记14 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xf…

【OpenSourceC#】ET框架

1. 前言 ET算是我刚接触客户端时最早知道的框架&#xff0c;ET我最初眼馋的还是他的双端功能。包揽前后端的功能&#xff0c;这个很有吸引力。但是那时候对我来说这框架太复杂了&#xff0c;没法看。 这两天又来看看&#xff0c;曾经很多不懂的地方现在都能看懂了&#xff0c…

数据库拆分5--使用sharding-jdbc来实现水平拆分

有三张表 user log order表&#xff0c;先将user log 和order垂直分库&#xff0c;然后将user表水平拆分 配置文件 spring.shardingsphere.enabledtruespring.shardingsphere.datasource.nameswim-user,wim-orderspring.shardingsphere.datasource.wim-user.typecom.alibaba.…

【JavaEE】多线程之Thread类

一、Thread类常见方法与字段 1、构造方法 构造方法说明Thread()不带参数的构造方法Thread(String name)可以在构造时传入线程的名字Thread(Runnable run)传入Runnable&#xff0c;是创建线程的方法之一Thread(Runnable run,String name)传入线程工作并给线程起名 2、常见属性…

JaveWeb框架(一):Web入门,Http的请求和响应,https介绍,Web实战自定义服务器

Servlet入门 MVC实战项目 仓储管理系统JavaWeb入门介绍Http协议Http请求数据格式Http响应数据格式Web实战Demo&#xff1a;自定义服务器对比Https协议总结Redis章节复习已经过去&#xff0c;新的章节JavaWeb开始了&#xff0c;这个章节中将会回顾JavaWeb实战项目 仓储管理 代码…

机器人开发--电机中的电流环、速度环、位置环

机器人开发--电机中的电流环、速度环、位置环电流环、速度环、位置环1 三环原理1.1 电流环1.2 速度环1.3 位置环2 各环与PID控制2.1 电流环重点在 PID&#xff08;比例、积分和微分&#xff09;2.2 速度环重点在 PI&#xff08;比例和积分&#xff09;2.3 位置环重点在 P&#…

基于JAVA的企业部门报销管理信息系统的设计与实现

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 系统部分主要分为以下几个模块&#xff1a;公告类型&#xff0c;公告信息&#xff0c;部门信息&#xff0c;员工信 息&a…

手写Spring9(实现FactoryBean、对象作用域)

文章目录前言目标设计项目结构一、实现1、Bean的作用范围定义和xml解析2、创建和修改对象时候判断单例和原型模式3、定义 FactoryBean 接口4、实现一个 FactoryBean 注册服务5、扩展 AbstractBeanFactory 创建对象逻辑二、测试1、事先准备2、定义 FactoryBean 对象3、配置文件4…