代码随想录算法训练营第五十七天 | 动态规划 part 15 | 392.判断子序列、115.不同的子序列

目录

392.判断子序列

Leetcode

思路

  1. dp[i][j] 表示以下标i-1为结尾的字符串s,和以下标j-1为结尾的字符串t,相同子序列的长度为dpij
  2. 递推公式:
  3. 初始化:为0
  4. 遍历顺序:从上到下,从左到右
  5. 举例:输入:s = "abc", t = "ahbgdc",dp状态转移图如下:

代码

python 复制代码
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] + 1
                else:
                    dp[i][j] = dp[i][j - 1]

        return dp[-1][-1] == len(s)
  • 时间复杂度:O(n × m)
  • 空间复杂度:O(n × m)

115.不同的子序列

Leetcode

思路

  1. dp[i][j]:以i-1为结尾的s子序列中出现以j-1为结尾的t的个数为dpij
  2. 递推公式:
    • 当si - 1 与 tj - 1相等时dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j]
    • 当si - 1 与 tj - 1不相等时 ,dpij只有一部分组成,不用si - 1来匹配(就是模拟在s中删除这个元素),即:dpi - 1j, 所以递推公式为:dp[i][j] = dp[i - 1][j]
  3. 初始化:从递推公式中看出,左上方和上方是需要初始化的,dpi0 和dp0j是一定要初始化的。dpi0 = 1, dp0j = 0, dp00 = 1。

  4. 遍历顺序:从上到下,从左到右
  5. 举例推导:以s:"baegg",t:"bag"为例,推导dp数组状态如下:

代码

python 复制代码
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] = 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] + dp[i - 1][j - 1]
                else:
                    dp[i][j] = dp[i - 1][j]
        
        return dp[-1][-1]
  • 时间复杂度:O(n × m)
  • 空间复杂度:O(n × m)
相关推荐
致Great4 小时前
DeepSeek Harness插件开发实战教程:我让它自己写了一个 arXiv 搜索插件
算法
XLYcmy7 小时前
京东 算法实习一面 下+手撕
c++·python·llm·概率论·数据处理·训练·codebert
虎头金猫7 小时前
如何在群晖NAS上通过Docker部署CloudSaver?群晖部署CloudSaver教程|聚合资源搜索并实现远程访问
运维·服务器·网络·python·docker·容器·pandas
从零开始学习人工智能7 小时前
WSL2部署CUDA12+cuDNN9踩坑实录:ONNX Runtime GPU推理环境搭建全流程
python
m0_380743877 小时前
从零调用 Claude 教程
开发语言·python·node.js
罗西的思考8 小时前
【Agent OS / AIOS】AOHP 深度解读:当 OS 开始为 Agent 而设计
人工智能·算法·机器学习
min(a,b)8 小时前
学习第17天:Agent Memory 与 MCP 协议
python·学习
民乐团扒谱机8 小时前
【微实验】组合优化matlab实战(马科维茨投资模型):在收益与风险之间,寻找最优的人生配比
大数据·人工智能·算法·机器学习·数学建模·matlab·组合优化
CodeBlog-star9 小时前
LLM安全实战:提示词注入与越狱攻击防御指南
python·agent·提示词攻击·越狱攻击
小柯南敲键盘9 小时前
电商图片翻译工具推荐,批量处理主图视频字幕,免费试用
大数据·人工智能·python·音视频