代码随想录算法训练营day55|392.判断子序列 |115.不同的子序列

news2025/4/25 21:33:38

392.判断子序列

力扣题目链接

给定字符串 s 和 t ,判断 s 是否为 t 的子序列。

字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。

示例 1:

  • 输入:s = “abc”, t = “ahbgdc”
  • 输出:true

示例 2:

  • 输入:s = “axc”, t = “ahbgdc”
  • 输出:false

提示:

  • 0 <= s.length <= 100
  • 0 <= t.length <= 10^4

两个字符串都只由小写字符组成。

  • 动态规划

1.确定dp数组(dp table)以及下标的含义**

dp[i][j] 表示以下标i-1为结尾的字符串s,和以下标j-1为结尾的字符串t,相同子序列的长度为dp[i][j]

2.确定递推公式

在确定递推公式的时候,首先要考虑如下两种操作,整理如下:

  • if (s[i - 1] == t[j - 1])
    • t中找到了一个字符在s中也出现了
  • if (s[i - 1] != t[j - 1])
    • 相当于t要删除元素,继续匹配

if (s[i - 1] == t[j - 1]),那么dp[i][j] = dp[i - 1][j - 1] + 1;,因为找到了一个相同的字符,相同子序列长度自然要在dp[i-1][j-1的基础上加1

if (s[i - 1] != t[j - 1]),此时相当于t要删除元素,t如果把当前元素t[j - 1]删除,那么dp[i][j] 的数值就是 看s[i - 1]与 t[j - 2]的比较结果了,即:dp[i][j] = dp[i][j - 1];

3.初始化

dp[i][0] 表示以下标i-1为结尾的字符串,与空字符串的相同子序列长度,所以为0. dp[0][j]同理。

4.遍历顺序

遍历顺序也应该是从上到下,从左到右

5.打印dp数组

以示例一为例,输入:s = “abc”, t = “ahbgdc”,dp状态转移图如下:

392.判断子序列2

dp[i][j]表示以下标i-1为结尾的字符串s和以下标j-1为结尾的字符串t 相同子序列的长度,所以如果dp[s.size()][t.size()] 与 字符串s的长度相同说明:s与t的最长相同子序列就是s,那么s 就是 t 的子序列。

图中dp[s.size()][t.size()] = 3, 而s.size() 也为3。所以s是t 的子序列,返回true。

class Solution {
    public boolean isSubsequence(String s, String t) {
        int[][] dp=new int[s.length()+1][t.length()+1];
        for(int i=1;i<=s.length();i++){
            for(int j=1;j<=t.length();j++){
                if(s.charAt(i-1)==t.charAt(j-1)){
                    dp[i][j]=dp[i-1][j-1]+1;
                }else{
                    dp[i][j]=dp[i][j-1];
                }

            }
        }
        if(dp[s.length()][t.length()]==s.length()){
            return true;
        }else{
            return false;
        }
    }
}

115.不同的子序列

力扣题目链接

给定一个字符串 s 和一个字符串 t ,计算在 s 的子序列中 t 出现的个数。

字符串的一个 子序列 是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串。(例如,“ACE” 是 “ABCDE” 的一个子序列,而 “AEC” 不是)

题目数据保证答案符合 32 位带符号整数范围。

115.不同的子序列示例

提示:

  • 0 <= s.length, t.length <= 1000

  • s 和 t 由英文字母组成

  • 动态规划

1.确定dp数组(dp table)以及下标的含义**

dp[i][j]:以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为dp[i][j]

2.确定递推公式

这一类问题,基本是要分析两种情况

  • s[i - 1] 与 t[j - 1]相等

    一部分是用s[i - 1]来匹配,那么个数为dp[i - 1][j - 1]。即不需要考虑当前s子串和t子串的最后一位字母,所以只需要 dp[i-1][j-1]

    一部分是不用s[i - 1]来匹配,个数为dp[i - 1][j]

  • s[i - 1] 与 t[j - 1] 不相等

    dp[i][j]只有一部分组成,不用s[i - 1]来匹配(就是模拟在s中删除这个元素),即:dp[i - 1][j]

    所以递推公式为:dp[i][j] = dp[i - 1][j]

3.初始化

如图:,那么 dp[i][0]dp[0][j]是一定要初始化的。

img

每次当初始化的时候,都要回顾一下dp[i][j]的定义,不要凭感觉初始化。

dp[i][0] 表示:以i-1为结尾的s可以随便删除元素,出现空字符串的个数。

那么dp[i][0]一定都是1,因为也就是把以i-1为结尾的s,删除所有元素,出现空字符串的个数就是1。

再来看dp[0][j]dp[0][j]:空字符串s可以随便删除元素,出现以j-1为结尾的字符串t的个数。

那么dp[0][j]一定都是0,s如论如何也变成不了t。

最后就要看一个特殊位置了,即:dp[0][0] 应该是多少。

dp[0][0]应该是1,空字符串s,可以删除0个元素,变成空字符串t。

4.遍历顺序

遍历顺序也应该是从上到下,从左到右

5.打印dp数组

以s:“baegg”,t:"bag"为例,推导dp数组状态如下:

115.不同的子序列

如果写出来的代码怎么改都通过不了,不妨把dp数组打印出来,看一看,是不是这样的。

动规五部曲分析完毕,代码如下:

class Solution {
    public int numDistinct(String s, String t) {
        int[][] dp=new int[s.length()+1][t.length()+1];
        for(int i=0;i<=s.length();i++){
            dp[i][0]=1;
        }
        for(int i=1;i<=s.length();i++){
            for(int j=1;j<=t.length();j++){
                if(s.charAt(i-1)==t.charAt(j-1)){
                    dp[i][j]=dp[i-1][j-1]+dp[i-1][j];
                }else{
                    dp[i][j]=dp[i-1][j];
                }
            }
        }
        return dp[s.length()][t.length()];
    }
}

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

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

相关文章

基于Xml方式Bean的配置-Bean的依赖注入以及·自动装配

Bean的依赖注入配置 Bean的依赖注入方式 注入方式配置方式通过Bean的set方法注入 <property name"userDAO" ref"userDAO"/> <property name"userDAO" value"userDAO"/> 通过构造Bean的方法进行注入 <constructor-arg n…

AB试验(三)一次试验的规范流程

AB试验&#xff08;三&#xff09;一次试验的规范流程 一次完整且规范的A/B试验可参考下图&#xff1a; 确定目标和假设 核心&#xff1a;A/B测试是因果推断&#xff0c;所以我们首先要确定原因和结果。目标决定了结果&#xff0c;而假设又决定了原因。 如何确定 分析问题&am…

极盾故事|“二次授权”“脱敏复原”,某银行数据动态脱敏系统get新技能?

数据&#xff0c;既要可用&#xff0c;又要安全&#xff0c;还要合规&#xff01;企业“一难、两难、多难”的困境&#xff0c;如何破&#xff1f; 极盾科技助力某商业银行&#xff0c;基于极盾觅踪构建应用数据动态脱敏系统&#xff0c;实现30&#xff0b;核心应用系统以及用户…

科技云报道:青云科技打出“AI算力牌”,抢跑“云+AI”新增市场

科技云报道原创。 近三年&#xff0c;中国云计算市场在多个维度同时发生着剧烈变化——疫情极大加速了全社会对于数字化的认知和接受程度&#xff1b;一系列云原生技术依托着开源和蓬勃的市场而迅速发展演变&#xff0c;更多产品和技术名词同时涌向市场&#xff1b;国际关系复…

Jenkins+Gitee+Docker+Ruoyi项目前后端分离部署

前言 描述&#xff1a;本文主要是用来记录 如何用标题上的技术&#xff0c;部署到云服务器上通过ip正常访问。 一、总览 1.1、Docker做的事 拉取 mysql 镜像拉取 redis 镜像拉取 jdk 镜像拉取 nginx 镜像 解释说明&#xff1a;前端项目的打包文件放在 nginx容器运行。后端…

时间在情绪周期视角来看也是不存在的

在交易软件里我们会发现有交易周期&#xff0c;分钟级别&#xff0c;小时级别&#xff0c;天&#xff0c;周&#xff0c;月&#xff0c;年等。对于超短线而言这些周期没有任何意义&#xff0c;换言之时间这个东西不是一个维度&#xff0c;所以你去用时间选出来的股票那代表什么…

以“窖主节”之名,泸州老窖邀你赴一场“浓烈”的约会

“永远不要低估一颗浓烈的心。” 最近&#xff0c;在河北秦皇岛海边沙滩上&#xff0c;一座“双手碰杯”的艺术装置吸引了不少来自天南海北的游客打卡拍照。原来&#xff0c;这是泸州老窖“窖主节”秦皇岛站的活动主题打卡点。 9月15日—17日&#xff0c;为期三天的泸州老窖“…

【VisualStudio】NuGet包管理器下载缓存packages文件夹过大怎么清理

使用Visual Studio 开发工具时间长了&#xff0c;会发现整个项目的总大小越来越大&#xff0c;默认是存放在电脑系统盘里的&#xff0c;随着Windows11系统常常更新重启&#xff0c;导致系统盘闲置空间越来越小&#xff0c;该怎么办呢。 描述问题 整个解决方案项目会越变越大&…

MURD560-ASEMI超快恢复二极管MURD560

编辑&#xff1a;ll MURD560-ASEMI超快恢复二极管MURD560 型号&#xff1a;MURD560 品牌&#xff1a;ASEMI 封装&#xff1a;TO-252 正向电流&#xff1a;5A 反向电压&#xff1a;600V 引线数量&#xff1a;3 芯片个数&#xff1a;1 芯片尺寸&#xff1a;74MIL 漏电流…

Spring Cloud Alibaba Ribbon负载均衡器

文章目录 Ribbon 负载均衡器环境搭建1.依赖2.配置3.修改其默认的负载均衡策略3.1 验证 4.创建自定义的Rule4.1 MyRule&#xff08;&#xff09;4.2 在配置config类中配置 5.饥饿加载6.我只想访问不想被别的访问 Ribbon 负载均衡器 背景 Ribbon 是一个用于客户端负载均衡的开源…

云原生容器平台——新华资产数字化转型加速器

新华资产管理股份有限公司&#xff08;以下简称“新华资产”&#xff09;于2006年5月经中国保险监督管理委员会批准、7月3日正式挂牌成立&#xff0c;是国内首批专业保险资产管理机构。2020年上半年&#xff0c;公司管理的资产规模突破万亿元人民币&#xff0c;投资收益水平居行…

Gin学习记录4——Controller和中间件

一. Controller 用不同的Controller可以实现业务的分类&#xff0c;不同类型的请求可以共用同一套中间件 1.1 单文件Controller 几乎等同于函数封装&#xff0c;直接将ctrl的代码写入到一个文件里然后调用&#xff1a; package adminimport ("net/http""git…

天猫健康“小补点”掀起养生新趋势,燕窝、自在水搭着喝双倍补

长时间对着电脑、一坐就是一天、想运动却挤不出时间……这几乎是大部分职场人的常态。为了守护健康&#xff0c;许多职场人开始探索便捷、有效的养生方式。 顺应这一需求&#xff0c;天猫健康发起“带薪养生小补点”活动&#xff0c;携手新加坡健康品牌余仁生、元气森林旗下品…

爬虫 — Scrapy 框架(二)

目录 一、Scrapy 核心文件1、spider2、Request3、构造 post 请求4、response 二、案例三、Scrapy 下载中间件1、执行顺序2、使用方法3、Download Middlewares 默认方法4、代理 IP4.1、工作原理4.2、分类4.3、查看 IP 地址4.4、常用代理 四、Scrapy 爬虫中间件五、Scrapy 下载图…

基础课-解析几何

1.平面直角坐标系 两点A(x1,y1)与B(x2,y2)之间的距离: 2.两点斜率公式 3.点到直线的距离 平行线之间的距离 4.平面直线方程的几种形式 点斜式 点P(x0,y0),斜率为k的直线方程:y-y0k(x-x0) 5.圆

会员管理系统H5-01会员开卡

我们前边7篇文章讲解的是PC端的功能&#xff0c;还需要为商家提供一套移动端的后台管理程序。在微搭中&#xff0c;移动端的后台程序我们可以使用H5进行开发&#xff0c;开发完毕后可以启用登录&#xff0c;这样管理员就可以在手机上进行操作。 01 创建应用 登录微搭后台&…

企业选择预测性维护解决方案的常见问题和PreMaint的策略

预测性维护技术在现代制造业中扮演着越来越重要的角色&#xff0c;有助于提高设备可靠性、降低维护成本并最大程度地减少停机时间。然而&#xff0c;一些企业在选择预测性维护解决方案时仍存在一些常见问题和误解。在这篇文章中&#xff0c;我们将探讨一些常见问题&#xff0c;…

Python与数据分析--Matplotlib-1

目录 1.Matplotlib库函数导入 2.简单尝试绘图 3.绘制多条折线图 4.绘制多种颜色风格曲线 5.图片内容文本操作实例 6.图例设置实例 7.坐标轴设置实例 1.Matplotlib库函数导入 #导入matplotlib库 import matplotlib as mpl import matplotlib.pyplot as plt #平常一般用第…

手把手教你前端 NodeJs 常用技术和第三方库使用详细教程(每周更新中)

dotenv 加载环境变量 dotenv是一个用于在Node.js项目中加载环境变量的库。它允许你将环境变量存储在一个名为.env的文件中&#xff0c;并在你的应用程序中轻松访问这些变量。 dotenv 官方网站&#xff1a;https://www.dotenv.org/docs 要使用dotenv&#xff0c;你需要首先在你…

(2023,微调节,多纵横比训练,细化模型)SDXL:用于高分辨率图像合成的改进的潜在扩散模型

SDXL: Improving Latent Diffusion Models for High-Resolution Image Synthesis 公众号&#xff1a;EDPJ&#xff08;添加 VX&#xff1a;CV_EDPJ 或直接进 Q 交流群&#xff1a;922230617 获取资料&#xff09; 目录 0. 摘要 1. 简介 2. 改进稳定扩散 2.1 架构与规模 …