不同的子序列 -- 动规

2023-10-27

115. 不同的子序列


class NumDistinct:
    """
    115. 不同的子序列
    https://leetcode.cn/problems/distinct-subsequences/description/
    """
    def solution1(self, s: str, t: str) -> int:
        """
        视角一,站在 t 的角度进行穷举 [盒子选择小球]
        t 中的若干字符就好像若干盒子
        s 中的若干字符就好像若干小球
        你需要做的就是给所有盒子都装一个小球

        M, N 分别代表 s, t 的长度
        状态个数【O(MN)】 * 函数本身的时间复杂度【O(M)】
        时间复杂度:O(MN) * O(M) = O(M^2 * N)
        空间复杂度:O(MN)

        :param s:
        :param t:
        :return:
        """
        self.memo = [[-1 for _ in range(len(t))] for _ in range(len(s))]
        return self.dp1(s, 0, t, 0)

    def dp1(self, s, i, t, j):
        """
        定义:s[i..] 的子序列中 t[j..] 出现的次数为 dp(s, i, t, j)
        :param s:
        :param i:
        :param t:
        :param j:
        :return:
        """
        # t 已经全部匹配完成
        if j == len(t):
            return 1

        #  s[i..] 比 t[j..] 还短,必然没有匹配的子序列
        if len(s) - i < len(t) - j:
            return 0

        #  查备忘录防止冗余计算
        if self.memo[i][j] != -1:
            return self.memo[i][j]

        res = 0
        # 站在 t 的角度进行穷举 [盒子选择小球]
        for k in range(i, len(s)):
            if s[k] == t[j]:
                res += self.dp1(s, k+1, t, j+1)

        self.memo[i][j] = res
        return res

    def solution2(self, s: str, t: str) -> int:
        """
        视角二,站在 s 的角度进行穷举 [小球选择盒子]

        M, N 分别代表 s, t 的长度
        状态个数【O(MN)】 * 函数本身的时间复杂度【O(1)】
        时间复杂度:O(MN) * O(1) = O(M * N)
        空间复杂度:O(MN)

        :param s:
        :param t:
        :return:
        """
        self.memo = [[-1 for _ in range(len(t))] for _ in range(len(s))]
        return self.dp2(s, 0, t, 0)

    def dp2(self, s, i, t, j):
        """
        定义:s[i..] 的子序列中 t[j..] 出现的次数为 dp(s, i, t, j)
        :param s:
        :param i:
        :param t:
        :param j:
        :return:
        """
        # t 已经全部匹配完成
        if j == len(t):
            return 1

        #  s[i..] 比 t[j..] 还短,必然没有匹配的子序列
        if len(s) - i < len(t) - j:
            return 0

        #  查备忘录防止冗余计算
        if self.memo[i][j] != -1:
            return self.memo[i][j]

        res = 0
        # 站在 s 的角度进行穷举 [小球选择盒子]
        if s[i] == t[j]:
            # 可以选择匹配和不匹配,所以两种情况需要叠加
            res += self.dp2(s, i + 1, t, j + 1) + self.dp2(s, i + 1, t, j)
        else:
            res += self.dp2(s, i + 1, t, j)

        self.memo[i][j] = res
        return res


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

不同的子序列 -- 动规 的相关文章

  • node环境下运行js代码缺少window环境原因与解决方案

    node环境下运行js代码缺少window环境原因与解决方案 目录 报错信息与截图 报错原因 解决方案 报错信息与截图 ReferenceError window is not defined 外链 报错原因 使用node环境直接运行js文
  • rpm软件包管理,YUM以及源码编译安装

    一 初始rpm软件包 1 软件包是由以下几个部分组成的 1 二进制程序 2 配置文件 组成方式有三种 单个文件 将主配置文件分割为多个小文件 并放置于某目录中 单个文件 在内部分割为多个段的 3 库文件 静态库 动态库 4 帮助文件 手册页
  • android的padding属性,android_padding属性及介绍.doc

    Android 的Margin和Padding属性以及支持的长度单位 Posted on 2011 04 26 18 41 蝈蝈俊 阅读 2960 评论 0 编辑 收藏 Android的Margin和Padding跟Html的是一样的 如下

随机推荐

  • JAVA 数据库读取blob(图片)合成多张图 基于Struts2和Spring

    今天工作要求把存在数据库的图片 blob 读取出来 之前没有做过所以找了不少资源 在这里记录一下 因为用的是jdbcTemplate 在这里一起贴出来 以防忘了 因为数据库查出来的图片是多张图 在这里返回List 到前台再转成byte 有些
  • spring Boot + Jpa(Hibernate) 架构基本配置

    1 基于springboot 1 4 0 RELEASE版本测试 2 springBoot Hibernate Druid Mysql servlet jsp 不废话 直接上代码 一 maven的pom文件
  • 手机网站如何封装成微信小程序

    封装手机网站为完整的微信小程序需要进行一系列的开发工作 涉及到多个文件和代码的编写 以下是一个基本的小程序代码结构示例 可以作为你封装手机网站的起点 app js 小程序的入口文件 用于全局的初始化和配置 App 全局数据 globalDa
  • ADMM算法求解一个简单的例子

    求解下面的带有等式约束和简单的边框约束 box constraints 的优化问题 minx y x 1 2 y 2 2s t 0 x 3 1 y 4 2x 3y 5 begin equation begin aligned min x y
  • 聊一聊.NET的网页抓取和编码转换

    在本文中 你会了解到两种用于 HTML 解析的类库 另外 我们将讨论关于网页抓取 编码转换和压缩处理的知识 以及如何在 NET 中实现它们 最后进行优化和改进 文章目录 1 背景 2 网页抓取 3 编码转换 4 网页压缩处理 5 代码优化
  • ElasticSearch+Kibana on K8s 讲解与实战操作(版本7.17.3)

    文章目录 一 概述 二 ElasticSearch 节点类型与作用 三 K8s 集群部署 四 ElasticSearch on K8s 开始部署 1 下载安装包 2 构建镜像 3 修改yaml编排 4 开始部署 5 测试 6 elastic
  • 5. 筛选和过滤

    文章目录 筛选和过滤 条件筛选 提取 抽样 最值 Index np argmax argmin np argsort 筛选和过滤 这小节与索引和切片有点类似 但倾向于从 整体 中统一筛选出 符合条件 的内容 而索引和切片更多的是依照 某种方
  • C++编译警告:warning C4305: 'initializing' : truncation from 'const double' to 'float'

    float a 4 14E 3 float a 3 1 类似的语句在编译的时候 会产生如下警告 warning C4305 initializing truncation from const double to float 虽然说不会导致
  • Apriori算法详解之【一、相关概念和核心步骤】

    感谢红兰整理的PPT 简单易懂 现在将其中精彩之处整理 与大家分享 一 Apriori算法简介 Apriori算法是一种挖掘关联规则的频繁项集算法 其核心思想是通过候选集生成和情节的向下封闭检测两个阶段来挖掘频繁项集 Apriori 先验的
  • 36奇迹发布网_8点1氪:王思聪已被取消限制消费令;拼多多大跌近23%,下一季度会继续“百亿补贴”;苹果发布千元iPhone11智能手机壳...

    11月20晚间 查询中国执行信息公开网发现 王思聪已不在限制消费人员名单之中 文 梦想家菜菜 邹黄晶 整理 Kr Lab 点击上方 36氪随声听 一键收听大公司热门新闻 听完音频记得添加进入 我的小程序 中哟 蜗牛移动 据IPO早知道 蜗牛
  • C++:auto&decltype

    auto用法 总述 C 11 auto可以在声明变量的时候根据变量初始值的类型自动为此变量选择匹配的类型 类似的关键字还有decltype 举个例子 auto的作用就是为了简化变量初始化 如果这个变量有一个很长很长的初始化类型 就可以用au
  • CAN学习笔记3:STM32 CAN控制器介绍

    STM32 CAN控制器 1 概述 STM32 CAN控制器 bxCAN 支持CAN 2 0A 和 CAN 2 0B Active版本协议 CAN 2 0A 只能处理标准数据帧且扩展帧的内容会识别错误 而CAN 2 0B Active 可以
  • BTC-数据结构

    哈希指针 hash pointers 普通的指针存储的是某个数据在内存中的首地址 哈希指针不仅要保存地址 还要保存数据的哈希值 通过哈希指针不仅能找到数据的位置 还能检测出数据有没有被篡改 因为保存了哈希值 区块链 比特币的基本数据结构即区
  • 泰勒图(Taylor diagram)

    感谢大家的收藏 我会继续完善这篇博客的 文章目录 定义 例子 拓展 英文原版定义 python绘图方法 定义 泰勒图 泰勒图1常用于评价模型的精度 常用的精度指标有相关系数 标准差以及均方根误差 RMSE 一般而言 泰勒图中的散点代表模型
  • PySpark环境配置

    首先 要知道PySpark是Spark为Python提供的API库 因此使用 pip install pyspark 下载pyspark不等于下载了spark 因此 配置pyspark环境 首先需要下载spark 1 linux下载spar
  • Android设备启动时出现pop音

    Android设备启动时出现pop音 Android设备启动时出现pop音 环境介绍 原因定位 Android混音 TEE SINK Android HAL层文件 异常原因 解决方案 解决方案应用 Android设备启动时出现pop音 针对
  • 使用CLion创建Cmake项目,使用GoogleTest和GoogleMock对代码进行测试

    文章目录 1 环境准备 2 CLion创建项目 3 编写测试用例 4 复杂测试用例 1 环境准备 注意版本匹配 我本地是g 8 1 0 的 最开始装了GoogleTest最新版1 10 0结果发现不能用 又回去下载旧的版本 g 8 1 0
  • opkg 不能更新和安装openwrt软件的方法

    首先 将所有的IPK 放在自己的虚拟HTTP服务器上 2 用Telnet进入路由器 使用VI编辑器 编程Opkg conf 命令 vi etc opkg conf3 修改文件 将第一行HTTP后面的部分 修改为第二步中查看到的IP地址 如果
  • c++ 泛型

    目录 1 什么是泛型 2 为什么需要泛型 3 泛型如何用 参考 泛型是什么 C 泛型编程又是什么 1 什么是泛型 泛型是什么 C 泛型编程又是什么 泛型 实质上就是不使用具体数据类型 例如 int double float 等 而是使用一种
  • 不同的子序列 -- 动规

    115 不同的子序列 class NumDistinct 115 不同的子序列 https leetcode cn problems distinct subsequences description def solution1 self