算法记录 | Day55 动态规划

news2024/11/16 9:29:12

392.判断子序列

思路:

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中也出现了,dp[i][j] = 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]是一定要初始化的。

392.判断子序列

4.遍历顺序

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

如图所示:

392.判断子序列1

5.举例推导dp数组

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

392.判断子序列2

class Solution:
    def isSubsequence(self, s: str, t: str) -> bool:
        size1 = len(s)
        size2 = len(t)
        if size1 > size2:
            return False

        dp =  [[0]* (size2+1) for _ in range(size1+1)]

        for i in range(1,size1+1):
            for j in range(1,size2+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[-1][-1] == len(s)

115.不同的子序列

思路:

1.确定dp数组(dp table)以及下标的含义:dp[i][j]:以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为dp[i][j]

2.递推公式:

  • if (s[i - 1] == t[j - 1])

    • dp[i][j]可以有两部分组

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

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

    • e.g: s:baggt:bag ,s[3] 和t[2]是相同的,但是字符串s也可以不用s[3]来匹配,即用s[0]s[1]s[2]组成的bag。当然也可以用s[3]来匹配,即:s[0]s[1]s[3]组成的bag。

      所以当s[i - 1] 与 t[j - 1]相等时,dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];

  • if (s[i - 1] != t[j - 1])

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

3.初始化:

  • dp[i][0] 表示以 i - 1 为结尾的 s 子序列中出现空字符串的个数。把 s 中的元素全删除,出现空字符串的个数就是 1,则 dp[i][0] = 1
  • dp[0][j] 表示空字符串中出现以 j - 1 结尾的 t 的个数,空字符串无论怎么变都不会变成 t,则 dp[0][j] = 0
  • dp[0][0] 表示空字符串中出现空字符串的个数,这个应该是 1,即 dp[0][0] = 1

4.确定遍历顺序

从递推公式dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]dp[i][j] = dp[i][j - 1] 中可以看出dp[i][j]都是根据左上方和正上方推出来的。从上到下,从左到右

img

5.举例推导dp数组

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fG53RlwB-1683555981910)(https://code-thinking.cdn.bcebos.com/pics/115.%E4%B8%8D%E5%90%8C%E7%9A%84%E5%AD%90%E5%BA%8F%E5%88%97.jpg)]

class Solution:
    def numDistinct(self, s: str, t: str) -> int:
        sizes = len(s)
        sizet = len(t)
        if sizet > sizes:
            return 0
        dp = [[0] *(sizet+1) for _ in range(sizes+1)]
        for i in range(sizes):
            dp[i][0] = 1
        for i in range(1,sizes+1):
            for j in range(1,sizet+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[-1][-1]

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

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

相关文章

线程同步、生产者消费模型和POSIX信号量

gitee仓库: 1.阻塞队列代码:https://gitee.com/WangZihao64/linux/tree/master/BlockQueue 2.环形队列代码:https://gitee.com/WangZihao64/linux/tree/master/ringqueue 条件变量 概念 概念: 利用线程间共享的全局变量进行同…

单片机c51中断 — 开关状态监测

项目文件 文件 关于项目的内容知识点可以见专栏单片机原理及应用 的第五章,中断 图中 P2.0引脚处接有一个发光二极管 D1,P3.2引脚处接有一个按键。要求分别采用一般方式和中断方式编程实现按键压下一次,D1 的发光状态反转一次的功能。 查询…

从C语言到C++⑦(第二章_类和对象_下篇)初始化列表+explicit+static成员+友元+内部类+匿名对象

目录 1. 构造函数的初始化列表 1.1 初始化列表概念 1.2 初始化列表注意事项 2. 构造函数的explicit关键字 2.1 C语言的隐式类型转换 2.2 explicit 关键字使用 3. static成员 3.1 static的概念 3.2 static成员特性 3.3 static成员使用场景 4. 友元(frien…

【Java 基础】类和对象 方法重载详解

《Java 零基础入门到精通》专栏持续更新中。通过本专栏你将学习到 Java 从入门到进阶再到实战的全套完整内容,所有内容均将集中于此专栏。无论是初学者还是有经验的开发人员,都可从本专栏获益。 订阅专栏后添加我微信或者进交流群,进群可找我领取 前端/Java/大数据/Python/低…

Linux 常用命令(1)

文章目录 Linux 常用命令格式 clear 清屏清屏获取当前目录的路径 pwd目录切换命令 cd进入上一级目录进入当前目录的文件夹 ta中(假设这里有一个文件夹ta)进入主目录进入根目录 显示目录内容 ls显示详细信息,包含文件属性显示全部内容,包含隐藏文件&#…

tiechui_lesson07_中断级和自旋锁

一、中断级IRQL 高级别可以打断低级别的调用,同级别不能打断同级别的调用。 中断级在软件层面分为三级,再高的级别是硬件发送的中断。 - 0 pass_level- 1 apc_level- 2 dpc_level 只有硬件中断能打断 1.获取中断级 DbgPrint("当前执行中断级为 %…

无法防范的网络攻击-DDOS

DDoS攻击(Distributed Denial of Service Attack)是一种网络攻击方式,攻击者通过利用大量的计算机或者网络设备向目标服务器发送大量的请求,使得目标服务器无法正常响应合法用户的请求,从而导致服务不可用或者服务质量…

M302H-YS-Hi3798MV300H/MV310-当贝纯净桌面卡刷固件包

M302H-YS-Hi3798MV300H/MV310-当贝纯净桌面卡刷固件包-内有教程及短接点提示 特点: 1、适用于对应型号的电视盒子刷机; 2、开放原厂固件屏蔽的市场安装和u盘安装apk; 3、修改dns,三网通用; 4、大量精简…

LicheePi4A尝鲜开箱笔记

开发板介绍 LicheePi4A是以 TH1520 主控核心,搭载 4TOPSint8 AI 算力的 NPU,支持双屏 4K 显示输出,支持 4K 摄像头接入,双千兆 POE 网口和多个 USB 接口,音频由 C906 核心处理。 LicheePi4A详细介绍可以在https://wi…

SpringCloud 微服务系列——Spring Cloud Alibaba 微服务工具集

✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…

FreeRTOS内核:详解Task各状态(GPT4帮写)

FreeRTOS内核:详解Task各状态(GPT4帮写) 1. 背景2. Task顶层状态区分3. 运行状态(Running)4. 非运行状态4.1 阻塞态(Blocked):4.2 挂起态(Suspended)4.3 就绪…

K8s基础8——svc基础使用、应用暴露、iptables代理、ipvs代理

文章目录 一、Service基本了解二、Service定义与创建2.1 相关命令2.2 yaml文件参数大全2.3 创建svc2.3.1 两种创建方式类比2.3.2 验证集群内A应用访问B应用2.3.3 将集群外服务定义为K8s的svc2.3.4 分配多个端口 2.4 常用三种类型2.4.1 ClusterIP(集群内部访问&#…

如何解决Redis的双写一致性

目录 1.更新策略2.问题场景3.解决方案 1.更新策略 Redis和MySQL的默认的更新策略是旁路缓存策略,旁路缓存策略又有写策略和读策略 写策略:更新时,先更新数据库,再更新缓存 读策略:读取数据时,如果命中缓…

自动驾驶——Smooth Local Planning

7.1参数曲线 在本模块中,我们将讨论分层运动规划器的最低级别,即局部规划器。作为提醒,局部规划器是分层规划器的一部分,它以无碰撞、高效和舒适的方式执行行为规划器所要求的机动。这导致轨迹,即在给定时间空间中的一…

【C++入门】auto关键字(C++11) + 指针空值nullptr(C++11)

👦个人主页:Weraphael ✍🏻作者简介:目前学习C和算法 ✈️专栏:C航路 🐋 希望大家多多支持,咱一起进步!😁 如果文章对你有帮助的话 欢迎 评论💬 点赞&#x1…

【谷粒商城之ThreadLocal用户身份鉴别】

本笔记内容为尚硅谷谷粒商城购物车ThreadLocal用户身份鉴别部分 目录 ThreadLocal 1.导入依赖 2.编写配置 3.配置Session 4.cookie中的user-key说明 5.编写To与常量 6.编写拦截器 7.添加拦截器的WebConfig配置类 8.Debug测试UserInfoTo中是否有数据 ThreadLocal T…

一篇文章搞定time_wait状态的诸多问题

今天聊聊 TIME_WAIT。 如果看过本文之后,你能够对如下“夺命连环问”做到胸中自有沟壑,则我心甚慰: 你觉得一台机器上看到多少 TIME_WAIT 属于不正常状态? 你觉得出现 TIME_WAIT 相关异常后,会对应用程序造成什么样的…

虚拟化技术简介

文章目录 前言一、什么是虚拟化?二、虚拟化的实现条件三、常见的虚拟化软件产品四、如何查看自己电脑是否支持虚拟化 前言 对于虚拟化技术的简单介绍。 一、什么是虚拟化? 将一台物理计算机虚拟为多台逻辑计算机。在一台计算机上同时运行多个虚拟机&am…

Oracle DataGuard奇怪的ORA-16494错误

Oracle数据库DataGuard数据无法同步,主库查询v$archive_dest出现ORA-16494错误。 数据库版本Oracle 12.1.0.2.0: SQL> select * from v$version;BANNER --------------------------------------------------------------------------------CON_ID --…

【深度学习】基于华为MindSpore和pytorch的卷积神经网络LeNet5实现MNIST手写识别

1 实验内容简介 1.1 实验目的 (1)熟练掌握卷积、池化概念; (2)熟练掌握卷积神经网络的基本原理; (3)熟练掌握各种卷积神经网络框架单元; (4)…