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

news2025/8/12 12:54:46

392.判断子序列

参考代码随想录算法训练营第五十五天 |392. 判断子序列、115. 不同的子序列 - 掘金

  • 暴力解法: Time Complexity: O(M*N)  Space Complexity: O(N)

class Solution:
    def isSubsequence(self, s: str, t: str) -> bool:
        start = 0 #used to make sure that the relative positions do not change
        for char in s:
            t = t[start:]
            idx = t.find(char)
            if idx == -1:
                return False
            start = idx + 1
        return True
  • 双指针:同时操作两个数组: Time Complexity: O(N)  Space Complexity: O(1)

class Solution(object):
    def isSubsequence(self, s, t):
        """
        :type s: str
        :type t: str
        :rtype: bool
        """
        pointerS = 0
        pointerT = 0

        while pointerT < len(t):
            if pointerS >= len(s):
                break
                
            if t[pointerT] == s[pointerS]:
                pointerS += 1
            pointerT += 1
        return pointerS == len(s)
        
  • 动态规划: Time Complexity: O(M*N)  Space Complexity: O(M*N)

五部曲:

1. 确定dp数组以及下标的含义:

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

2. 确定递推公式:

    首先要考虑如下两种操作:

  • if (s[i - 1] == t[j - 1]):也就是t中找到了一个字符在s中也出现了。那么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数组如何初始化:从递推公式可以看出dp[i][j]都是依赖于dp[i - 1][j - 1] 和 dp[i][j - 1],         所。以dp[0][0]和dp[i][0]是一定要初始化的。dp[i][0] 表示以下标i-1为结尾的字符串,与空字符串的相同子序列长度,所以为0. dp[0][j]同理。

(这里大家已经可以发现,在定义dp[i][j]含义的时候为什么要表示以下标i-1为结尾的字符         串s,和以下标j-1为结尾的字符串t,相同子序列的长度为dp[i][j]。因为这样的定义在dp二       维矩阵中可以留出初始化的区间。如果要是定义的dp[i][j]是以下标i为结尾的字符串s和以下标j为结尾的字符串t,初始化就比较麻烦了。)

这与#718,#1143和#1035对于dp数组的定义出于同样的目的,都是可以简化初始化过程。二刷时确定一下按照哪个方式来写,固定下来

4. 确定遍历顺序:从递推公式可以看出dp[i][j]都是依赖于dp[i - 1][j - 1] 和 dp[i][j - 1],那么遍历顺序也应该是从上到下,从左到右

5. 打印检查

class Solution(object):
    def isSubsequence(self, s, t):
        """
        :type s: str
        :type t: str
        :rtype: bool
        """
        dp = [[0]*(len(t)+1) for _ in range(len(s)+1)]
        # print(dp)

        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]+1
                else:
                    dp[i][j] = dp[i][j-1]

        return dp[len(s)][len(t)] == len(s)
        

115.不同的子序列

Q:#392在定义dp数组时是dp = [[0]*(len(t)+1) for _ in range(len(s)+1)](s is a subsequence of t);这道题是t is a subsequence of s,dp数组定义也是dp = [[0] * (len(t)+1) for _ in range(len(s)+1)],为什么可以这样?

class Solution(object):
    def numDistinct(self, s, t):
        """
        :type s: str
        :type t: str
        :rtype: int
        """
        dp = [[0]*(len(t)+1) for _ in range(len(s)+1)]
        print(dp)
        for i in range(len(s)):
            dp[i][0] = 1
        for j in range(1, len(t)):
            dp[0][j] = 0

        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] + dp[i-1][j]
                else:
                    dp[i][j] = dp[i-1][j]
        return dp[len(s)][len(t)]

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

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

相关文章

[附源码]java毕业设计医院网上预约系统

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

Docker(9)DockerFile

文章目录什么是DockerFile构建过程执行DockerFile大致流程常用保留字DockerFile小案例创建dockerfile文件dockerfile内部脚本执行命令虚悬镜像什么是DockerFile DockerFile 使用来构建Docker镜像的文本文件&#xff0c;是由一条条构建镜像所需要的指令和参数组成脚本 构建过程…

CSDN Markdown 编辑器的目录与页内跳转功能

CSDN Markdown 编辑器的目录与页内跳转功能 文章目录CSDN Markdown 编辑器的目录与页内跳转功能 目录 页内跳转 正文内容跳转到标题正文内容跳转到正文内容结语目录 CSDN Markdown 编辑器的目录功能使用[TOC](你想要显示的目录总标题)格式&#xff0c;其中默认可省略括号及括…

2022-11-06 网工进阶(三十五)---PIM-SM工作原理(组播分发树的形成、ASM、SSM)

PIM-DM的局限性 中大型组播网络中由于网络较大&#xff0c;如果依然使用PIM-DM会遇到诸多问题&#xff1a; 1 使用“扩散-剪枝”方式需要全网扩散组播报文&#xff0c;对于网络有一定冲击。 2 所有组播路由器均需要维护组播路由表&#xff0c;即使该组播路由器无需转发组播数…

ARM-A架构入门基础(一)预备知识

14天学习训练营导师课程&#xff1a;周贺贺《ARMv8/ARMv9架构-快速入门》 1. 背景 ARM全称&#xff1a; Advanced RISC Machines。 ARM处理器&#xff1a; 基于ARM公司设计的架构而研发的处理器&#xff0c;包含arm core和外设。ARM公司本身不生产处理器&#xff0c;只出售技…

RNA-seq 详细教程:分析流程介绍(1)

学习目标 了解从 RNA 提取到获取基因表达矩阵&#xff0c; 既RNA-seq 分析的整个流程。 1. workflow 进行差异表达基因分析的前提是&#xff0c;获取代表基因表达水平的矩阵。因此在进行分析前&#xff0c;必须知道基因表达矩阵是如何产生的。 在本教程中&#xff0c;将会简要的…

基于JAVA的鲜花店商城平台【数据库设计、源码、开题报告】

数据库脚本下载地址&#xff1a; https://download.csdn.net/download/itrjxxs_com/86427660 摘要 在互联网不断发展的时代之下&#xff0c;鲜花软件可以为鲜花企业带来更多的发展机会&#xff0c;让企业可以挖掘到更多的潜在用户&#xff0c;同时结合企业的优势就能够为用户…

【单目标优化求解】粒子群混沌混合蝴蝶优化算法求解最优目标问题(HPSOBOA)【含Matlab源码 1538期】

⛄一、遗传算法简介 1 算法的种群初始化 设D维搜索空间中&#xff0c;随机生成初始解的表达式为&#xff1a; 式中&#xff0c;Xi表示蝴蝶群体中第i只蝴蝶(i 1, 2, 3, …, N)空间位置&#xff0c;N表示初始解的个数&#xff1b;Lb, Ub分别表示搜索空间的上界和下界&#xff…

Linux vmware 编译模块失败。 Vmware player Unable to install all modules.

Vmware player Unable to install all modules. See log for details ubuntu下的vmware play经常会让更新模块。一起点击确认就可以正常编译更新。 而且一定要编译后才能打开虚拟机系统 但是奇怪的是&#xff0c;最近一次点击 更新&#xff0c;报错&#xff1a; 显示的英文…

STM32F103的FSMC模块驱动LCD屏幕

以下内容为对正点原子的STM32F103STM32F103STM32F103精英板的FSMCFSMCFSMC模块驱动LCDLCDLCD屏幕例程的学习。做一个记录来加强对模块的认知。 FSMCFSMCFSMC的全称是FlexiblestaticmemorycontrollerFlexible\quad static\quad memory\quad controllerFlexiblestaticmemory…

【Python+Appium】开展自动化测试(四)使用weditor进行元素定位

目录 前言 一&#xff0c;weditor的安装与使用 二&#xff0c;遇到的问题 结语 前言 上一篇我们讲到了如何通过编写一个简单的Python脚本完成了登录app的操作&#xff0c;如何断言&#xff0c;如何编写一条完整的用例。那么今天继续我们的自动化测试第四天&#xff0c;使用…

【Java进阶篇】第五章 集合(下)--Map集合

文章目录1、概述2、Map接口中的常用方法3、Map集合的遍历4、哈希表的数据结构5、Map集合的存取6、hashCode(&#xff09;和equals()的重写7、一些小零散的东西8、HashMap和Hashtable的区别9、Properties类10、TreeMap11、自定义类实现Comparable接口12、二叉树13、Comparator接…

Caffeine《一》

《Caffeine&#xff08;Java顶级缓存组件&#xff09;一》 提示: 本材料只做个人学习参考,不作为系统的学习流程,请注意识别!!! 《Caffeine&#xff08;Java顶级缓存组件&#xff09;》《Caffeine&#xff08;Java顶级缓存组件&#xff09;一》1. Caffeine缓存概念1.1 缓存的分…

【MyBatis】一、概述

框架 框架就是对通用代码的封装&#xff0c;提前写好了一堆接口和类&#xff0c;我们可以在做项目的时候直接引入这些接口和类&#xff0c;基于这些现有的接口和类进行开发&#xff0c;提高开发效率。 框架一般以jar包形式存在 三层架构 表现层&#xff08;UI&#xff09;&am…

数字化助力生产管理:计件工资管理系统

目前因市场经济的发展&#xff0c;企业为求发展同时为防止消极怠工的情况&#xff0c;常把员工工资与产量结合起来。为了增加工人的劳动积极性&#xff0c;秉持多劳多得的科学管理理念&#xff0c;许多生产类型企业均实现了计件工资制。所谓的计件工资制是指按照生产的合格品的…

python之opencv人脸识别快速体验

目录 1、灰度转换 2、引用opencv官方提供的人脸训练模型 3、绘制方框&#xff08;用于框住人脸&#xff09; 4、效果及完整代码&#xff1a; 5、检测多张人脸&#xff1a; 学习链接&#xff1a; 1、灰度转换 # 灰度转换gary cv.cvtColor(img,cv.COLOR_BGR2GRAY) 2、引…

图解:Elasticsearch 8.X 如何求解环比上升比例?

1、企业级Elasticsearch 8.X 实战问题 问题描述&#xff1a;有个聚合的需求&#xff0c;问下大家&#xff0c;一个索引中有时间字段 要求 计算本月和上月相比的环比上升比例&#xff1f;——来自GPVIP群 2、问题释义 2.1 啥叫环比&#xff1f; 环比是统计学术语&#xff0c…

LabVIEW使用Deskto pExecution Trace工具包

LabVIEW使用Deskto pExecution Trace工具包 可以使用桌面执行跟踪工具包来调试和优化大型LabVIEW应用程序&#xff0c;包括具有多个循环的应用程序、客户端-服务器架构、动态加载VI等。该工具包从本地或远程计算机桌面上运行的应用程序捕获执行事件&#xff0c;并在表窗格中显…

PCB layout有DRC为什么还要用CAM和DFM检查?

随着电子产品的高速发展&#xff0c;PCB生产中大量使用BGA、QFP、PGA和CSP等高集成度封装器件&#xff0c;PCB的复杂程度也大大增加&#xff0c;这对于PCB设计也提出了更高的要求。所以在PCB设计阶段&#xff0c;除了基础的电气性能之外&#xff0c;还需要考虑可制造性&#xf…

上游模式用于实验室用冷冻机压力和真空度的高精度控制

摘要&#xff1a;本文针对实验室用冷冻干燥机的真空度控制&#xff0c;提出了干燥过程中的真空度精密控制解决方案。解决方案主要是采用双真空计&#xff08;电容真空计和皮拉尼真空计&#xff09;测量干燥过程中的真空度变化&#xff0c;双通道PID真空度控制器一方面采集电容真…