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

python-leetcode-统计构造好字符串的方案数

2466. 统计构造好字符串的方案数 - 力扣(LeetCode)

这个问题可以用**动态规划(DP)**来解决,思路如下:


思路

1. 定义 DP 数组

dp[i] 表示长度为 i 的好字符串的个数

2. 状态转移方程
  • 我们可以在 dp[i] 的基础上添加 zero'0',得到 dp[i + zero]
  • 或者在 dp[i] 的基础上添加 one'1',得到 dp[i + one]

因此,状态转移方程为:dp[i]=dp[i−zero]+dp[i−one]

需要对 10^9 + 7 取模。

3. 初始化
  • dp[0] = 1,表示空字符串。
4. 目标
  • 我们要求 low ≤ i ≤ high 之间的所有 dp[i] 的总和。

代码实现

def countGoodStrings(low: int, high: int, zero: int, one: int) -> int:
    MOD = 10**9 + 7
    dp = [0] * (high + 1)
    dp[0] = 1  # 空字符串

    # 计算 dp
    for i in range(1, high + 1):
        if i >= zero:
            dp[i] = (dp[i] + dp[i - zero]) % MOD
        if i >= one:
            dp[i] = (dp[i] + dp[i - one]) % MOD

    # 计算 [low, high] 之间的总和
    return sum(dp[low: high + 1]) % MOD

复杂度分析

  • 时间复杂度:O(high)。
  • 空间复杂度:O(high)。

示例

输入
print(countGoodStrings(2, 3, 1, 2))
输出
5
解释

满足条件的字符串:

  • "00""11""01""10""001"

优化

由于 dp[i] 只依赖于前面的 dp[i-zero]dp[i-one],可以用一个变量存储 dp[low]dp[high] 之间的和,减少不必要的计算:

def countGoodStrings(low: int, high: int, zero: int, one: int) -> int:
    MOD = 10**9 + 7
    dp = [1] + [0] * high
    result = 0

    for i in range(1, high + 1):
        if i >= zero:
            dp[i] = (dp[i] + dp[i - zero]) % MOD
        if i >= one:
            dp[i] = (dp[i] + dp[i - one]) % MOD
        if i >= low:
            result = (result + dp[i]) % MOD  # 直接求和

    return result

这样可以避免额外的 sum() 计算,使得代码更高效!🚀

http://www.dtcms.com/a/55665.html

相关文章:

  • 蓝桥杯-15届研究生组-A 劲舞团
  • IDEA2023 使用枚举类型java: 非法字符: ‘\ufffd‘
  • 超链接打开新页签传递参数
  • 【目标检测】Efficient Feature Fusion for UAV Object Detection
  • AI编程: 一个案例对比CPU和GPU在深度学习方面的性能差异
  • 双指针7:LCR 007. 三数之和
  • C++智能指针weak_ptr
  • 从0开始的操作系统手搓教程24——完成我们的键盘驱动子系统
  • Ubuntu的软件源
  • 23种设计模式简介
  • 深入理解sync pool
  • 《深入浅出数据索引》- 大参林信息中心内部培训课程笔记
  • CefSharp 文件下载和保存功能-监听前端事件
  • Unity光照之Halo组件
  • 基于Spark的热门动漫推荐数据分析与可视化系统的设计与实现(采用Python语言Django框架,Hadoop,spider爬虫等技术实现)
  • 基于SpringBoot的智慧停车场小程序(源码+论文+部署教程)
  • 【科一】综合素质
  • 【轻松学C:编程小白的大冒险】---常量的定义、声明与应用场景 07
  • 13.数据结构(软考)
  • TypeError: Assignment to constant variable.
  • WebSocket:实现实时通信的利器
  • 【Bert系列模型】
  • 【记录一下学习】Embedding 与向量数据库
  • 结合rpart包的决策树介绍
  • 新疆美女演员吾热叶提正式加入创星演员出道计划,开启演艺事业新篇章
  • 【HeadFirst系列之HeadFirst设计模式】第17天之深入责任链模式:应对复杂请求处理的设计思路
  • 深入解析Seata:分布式事务的终极解决方案
  • 【情境领导者】评估情境——准备度水平
  • 开发环境搭建-完善登录功能
  • 静态时序分析:SDC约束命令set_ideal_network详解