当前位置: 首页 > news >正文

代码随想录算法训练营Day54 | 392.判断子序列、115.不同的子序列 | Python | 个人记录向

本文目录

  • 392.判断子序列
    • 做题
    • 看文章
  • 115.不同的子序列
    • 做题
    • 看文章
  • 以往忽略的知识点小结
  • 个人体会

392.判断子序列

代码随想录:392.判断子序列
Leetcode:392.判断子序列

做题

借鉴Day53中1143.最长公共子序列的思路,最后改一下判断逻辑即可。

class Solution:def isSubsequence(self, s: str, t: str) -> bool:dp = [[0] * (len(s)+1) for _ in range(len(t)+1)]for i in range(1, len(t)+1):for j in range(1, len(s)+1):if t[i-1] == s[j-1]:dp[i][j] = dp[i-1][j-1] + 1else:dp[i][j] = max(dp[i][j-1], dp[i-1][j])if dp[len(t)][len(s)] == len(s):return Trueelse:return False

时间复杂度:O(n × m)
空间复杂度:O(n × m)

看文章

思路一致。

115.不同的子序列

代码随想录:115.不同的子序列
Leetcode:115.不同的子序列

做题

无思路。

看文章

这道题很难,题解也看了很久。
动规五部曲:

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

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

  2. 确定递推公式。这一类问题,基本是要分析两种情况:

    s[i - 1] 与 t[j - 1]相等,dp[i][j]可以有两部分组成。
    一部分是用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]。

  3. dp数组如何初始化。

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

    dp[0][j]:空字符串s可以随便删除元素,出现以j-1为结尾的字符串t的个数。那么dp[0][j]一定都是0,s如论如何也变成不了t。

  4. 确定遍历顺序。

    外部遍历 s,内部遍历 t。

  5. 举例推导dp数组。

代码如下:

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

以往忽略的知识点小结

  • 回到动规五部曲的基本思路,特别是dp数组的含义

个人体会

完成时间:1h30min。
心得:115.不同的子序列比较难,看了好久,需要回归到动规五部曲的基本思路,特别是dp数组的含义。

http://www.lryc.cn/news/357303.html

相关文章:

  • 利用oracle默认事务隔离级别(提交读)提升多表联查速度
  • B/S架构+java语言+Mysqladr数 据 库ADR药物不良反应监测系统源码 ADR药物不良反应监测系统有哪些作用?
  • Matlab中% note that Wilkinson notation (‘L1~L4~1‘) is used to specify the model
  • 测试测试测试
  • 动态规划专题
  • .net8.0与halcon编程环境构建
  • 文心智能体平台:快来创建你的Java学习小助理,全方位辅助学习
  • AppInventor2 表格布局的外面的黑框怎么去掉?
  • 爬楼梯(进阶版)
  • echarts-事件
  • 备受推崇的公司文件加密文件推荐榜单
  • QT——QSlider实现,QT滑动控件的使用
  • 【网络协议Http】Http中get,post,put,delete区别
  • 软硬中断区别,磁盘块、扇区、页区别与之间的关系
  • 在线思维导图编辑!3个AI思维导图生成软件推荐!
  • 使用 Ubuntu + Docker + Vaultwarden + Tailscale 自建密码管理器
  • YOLOv7添加注意力机制和各种改进模块
  • 【OpenGL第一个程序】
  • GPT-4O神器来袭!自动生成Figma设计稿,移动端开发瞬间加速!
  • 清华大学提出IFT对齐算法,打破SFT与RLHF局限性
  • TS(TypeScript)中Array数组无法调出使用includes方法,显示红色警告
  • 基于Kafka的日志采集
  • 某烟草企业数字化转型物流信息化咨询项目规划方案(117页PPT)
  • 失落的方舟 命运方舟台服封号严重 游戏封IP怎么办
  • 2.10 mysql设置远程访问权限
  • C# 证件照替换底色与设置背景图---PaddleSegSharp
  • HCIA-HarmonyOS Device Developer 课程大纲
  • 洗地机哪个牌子最好用?十大名牌洗地机排行榜
  • Unity开发——XLua热更新之Hotfix配置(包含xlua获取与导入)
  • Qt 基于FFmpeg的视频转换器 - 转GIF动图