代码随想录算法训练营第五十四天|392.判断子序列 115.不同的子序列

文档讲解:代码随想录

视频讲解:代码随想录B站账号

状态:看了视频题解和文章解析后做出来了

392.判断子序列 

class Solution:def isSubsequence(self, s: str, t: str) -> bool:dp = [[0] * (len(t)+1) for _ in range(len(s)+1)]for i in range(1, len(s) + 1):for j in range(1, len(t) + 1):if s[i-1] == t[j-1]:dp[i][j] = dp[i-1][j-1] + 1else:dp[i][j] = dp[i][j-1]return dp[len(s)][len(t)] == len(s)
  •     时间复杂度:O(n^2)
  •     空间复杂度:O(n)

1. 确定dp数组的含义

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

这里用i,j表示 i-1,j-1 是为了给初始化留一行和一列,而且递推公式也更方便。

2. 确定递推公式

第一种情况:s和j的元素相等,dp[i][j] 在 dp[i-1][j-1] 的基础上 + 1

第二种情况:s和j元素不相等,相当于要删除掉 j 的 i 位元素再去做对比,那就是 dp[i][j] = dp[i][j-1]

3. dp数组初始化

从递推公式可以看出dp[i][j]都是依赖于dp[i - 1][j - 1] 和 dp[i][j - 1],所以dp[0][0]和dp[i][0]是一定要初始化的。

4. 确定遍历顺序

递推公式中的j是i和j之前的元素下标,所以从前往后递推。

5. 举例

 115.不同的子序列 

class Solution:def numDistinct(self, s: str, t: str) -> int:dp = [[0] * (len(s) + 1) for _ in range(len(t) + 1)]for i in range(1, len(s) + 1):if t[0] == s[i-1]:dp[1][i] = dp[1][i-1] + 1else:dp[1][i] = dp[1][i-1]for i in range(2, len(t) + 1):for j in range(1, len(s) + 1):if t[i-1] == s[j-1]:dp[i][j] = dp[i][j-1] + dp[i-1][j-1]else:dp[i][j] = dp[i][j-1]return dp[-1][-1]
  •     时间复杂度:O(n^2)
  •     空间复杂度:O(n)

1. 确定dp数组的含义

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

2. 确定递推公式

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

当s[i - 1] 与 t[j - 1]相等时,dp[i][j]可以有两部分组成。

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

3. dp数组初始化

初始化t的第一个字符对应的子字符串数量。

4. 确定遍历顺序

递推公式中的j是i和j之前的元素下标,所以从前往后递推。

5. 举例

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

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

相关文章

Java 关于批量插入遇到的问题 -sqlserver

序言: 我们在做项目的时候,经常会遇到,对数据的新增动作,如果数据量很少的情况下,单个新增对性能还好,但是一旦涉及到 大数据量,如十万,百万,千万,这个时候如…

RabbitMq使用与整合

MQ基本概念 MQ概述 MQ全称 Message Queue([kjuː])(消息队列),是在消息的传输过程中保存消息的容器。多用于分布式系统之间进行通信。 (队列是一种容器,用于存放数据的都是容器,存…

优秀的时间追踪软件Timemator for Mac轻松管理时间!

在现代社会,时间管理成为了我们工作和生活中的一大挑战。如果你经常感到时间不够用,无法高效地完成任务,那么Timemator for Mac将成为你的得力助手。 Timemator for Mac是一款出色的时间追踪软件,它可以帮助你精确记录和管理你的…

Linux的基本指令 ( 一 )

目录 前言 Linux基本指令 快速认识五个指令 ls指令 补充内容 pwd指令 补充内容 cd指令 补充内容 重新认识指令 指令的本质 which指令 alias指令 最后 一个文件的三种时间 tree指令及安装 tree指令 前言 关于Linux操作系统的桌面,在学校教学中我们…

实用高效 无人机光伏巡检系统助力电站可持续发展

近年来,我国光伏发电行业规模日益壮大,全球领先地位愈发巩固。为解决光伏电站运维中的难题,浙江某光伏电站与复亚智能达成战略合作,共同推出全自动无人机光伏巡检系统,旨在提高发电效率、降低运维成本,最大…

Spark---SparkCore(一)

一、术语与宽窄依赖 1、术语解释 1、Master(standalone):资源管理的主节点(进程) 2、Cluster Manager:在集群上获取资源的外部服务(例如:standalone,Mesos,Yarn) 3、Worker Node(standalone):资源管理的从节点(进程)或者说管理本机资源的…

用Python写一个浏览器集群框架

更多Python学习内容:ipengtao.com 在分布式爬虫和大规模数据采集的场景中,使用浏览器集群是一种有效的方式,可以提高数据采集的速度和效率。本文将介绍如何用Python编写一个简单但强大的浏览器集群框架,以应对需要使用多个浏览器实…

WebGL/threeJS面试题扫描与总结

什么是 WebGL?什么是 Three.js?请解释three.js中的WebGL和Canvas的区别? WebGL(全写Web Graphics Library)是一种3D绘图协议,这种绘图技术标准允许把JavaScript和OpenGL ES 2.0结合在一起,通过增加OpenGL ES 2.0的一个…

分库分表、分布式数据库、MPP

分库分表、分布式数据库、MPP的区别吗? 一、MySQL分库分表和MySQL分布式集群在性能方面各有优劣,具体取决于应用场景和需求。 MySQL分库分表: 在分库分表的场景下,可以将负载分散到多个数据库实例上,从而提高整体性能…

【模糊测试】课堂笔记

模糊测试 模糊测试过程通常是自动化的。这个过程经典地分为以下几个阶段。 准备:这是第一阶段,重点是 SUT 输入和输出格式的识别和规范。基于此,规范可以减少生成初始无效模糊数据的可能性并创建有效且精确的输入。Fuzz Data Generation&am…

思科模拟器操作命令

模式 思科模拟器常见的模式有 用户模式 能够操作的命令比较少 特权模式特权模式下面可以操作的比较多 全局模式 接口模式 用户模式进入特权模式: 命令enable 特权模式进行全局模式命令: configure terminal 退出命令 exit命令:返回上一层,即一步一步…

RocketMQ 消息中间件 知识点汇总

目录 RocketMQ1、什么是RocketMQ?常用术语:2、为什么需要消息队列3、什么是异步处理4、什么是服务解耦5、什么是流量控制6、消息队列两种模型队列模型:发布/订阅模型:总结:7、怎么保证消息不丢失8、如何处理消息被重复消费**出现消息重复的情况:****解决方法:**9、如何保…

流量分析-PhishingEmail_WriteUp

一、题目问题 问题1:黑客的email名称 问题2:黑客向几人发送了钓鱼邮件 问题3:黑客传输的木马文件名 问题4:下载并运行了木马文件的人的email名称和ip地址,用“-”连接 问题5:黑客用于反弹shell的主机i…

什么葡萄酒会适用这种双重滗析方法呢?

滗析有两个主要目的,一种是去除陈年或未经过滤的葡萄酒中的沉淀物。虽然沉淀物不会对你造成任何伤害,但当喝葡萄酒满嘴都是葡萄沉淀物时是一件很糟糕的事。其次,倾析葡萄酒是可以让葡萄酒“呼吸”与氧气接触的,氧气可以软化单宁&a…

二维数值型数组例题

1、单位矩阵初始化 题目描述 对用作单位矩阵的数组初始化。单位矩阵在主对角线上的值为1,而其他的地方的值为0,并且主对角线上的行、列下标是一样的。 输入要求 输入一个整数n表示矩阵的行数 输出要求 输出n*n的单位矩阵。数据之间以空格间隔&…

LeetCode Hot100 102.二叉树的层序遍历

题目&#xff1a; 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 方法&#xff1a;迭代 class Solution {public List<List<Integer>> levelOrder(TreeNode root) {if …

C语言——输入一个4位正整数,输出其逆数。

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> int main() {int i,j 0;int a1,a2,a3,a4;printf("输入一个4位正整数&#xff1a;\n");scanf("%d",&i);a1 i/1000; a2 i/100%10; a3 i/10%10; a4 i%10; printf("千位a1%d,百位a…

【JavaFx】利用JavaFx写一个登录页面

以下是一个基本的JavaFX登录页面示例: import javafx.application.Application; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.co…

mysql的alter怎么使用?

在MySQL中&#xff0c;ALTER语句用于修改数据库的表结构。下面是一些ALTER语句的示例用法&#xff1a; 1. 添加列&#xff1a; ALTER TABLE 表名 ADD 列名 数据类型; 2. 修改列的数据类型&#xff1a; ALTER TABLE 表名 MODIFY 列名 新数据类型; 3. 修…

新人工作方法论:高效率的工作

引言&#xff1a; 转眼间入职半载&#xff0c;在工作期间曾迷茫、困惑&#xff0c;深深的感受到职场身份的转变带来的痛苦。痛苦的原因不仅仅包括学生时代自己闷头做事的思维习惯与团队合作需求的差异性&#xff0c;也包括缺乏体系的工作方法。 自己在网络上查了一些方法论&a…