Leetcode---2466.统计构造好字符串的个数,70.爬楼梯

简介: 简单使用

动态规划五部

/* 动态规划五部曲:

  • 1.确定dp[i]的下标以及dp值的含义: 爬到第i层楼梯,有dp[i]种方法;
  • 2.确定动态规划的递推公式:dp[i] = dp[i-1] + dp[i-2];
  • 3.dp数组的初始化:因为提示中,1<=n<=45 所以初始化值,dp[1] = 1, dp[2] = 2;
  • 4.确定遍历顺序:分析递推公式可知当前值依赖前两个值来确定,所以递推顺序应该是从前往后;
  • 5.打印dp数组看自己写的对不对;

爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
思路:动态规划
当我们最后爬到楼顶时可能是一步,也可能是两步,我们列出f(x)=f(x−1)+f(x−2),
我们可以知道实际上爬到x层的方案就是爬到x-1层和x-2层的方案之和。
我们要讨论其中的边界值,爬到0级是一种方案,爬到1级只有一种方案,
则F[0]=1,F[1]=1

题目

给你整数 zero ,one ,low 和 high ,我们从空字符串开始构造一个字符串,每一步执行下面操作中的一种:

将 ‘0’ 在字符串末尾添加 zero 次。
将 ‘1’ 在字符串末尾添加 one 次。
以上操作可以执行任意次。

如果通过以上过程得到一个 长度 在 low 和 high 之间(包含上下边界)的字符串,那么这个字符串我们称为 好 字符串。

请你返回满足以上要求的 不同 好字符串数目。由于答案可能很大,请将结果对 109 + 7 取余 后返回。

分析

该题简单来说就是爬楼梯的换皮游戏。即是最后一次可以添加0也可以添加1,我们还可以列出
f[x]=f[x-zero]+f[x-one]
方程的意思是长度为i的字符串,可以由长度为i-one的字符串+one个1构成,也可以由长度为i-zero的字符串+zero个0构成。
class Solution:

def countGoodStrings(self, low: int, high: int, zero: int, one: int) -> int:
    MOD = 10 ** 9 + 7
    f = [1] + [0] * high  # f[i] 表示构造长为 i 的字符串的方案数,其中构造空串的方案数为 1,
    for i in range(1, high + 1):
        if i >= one:  f[i] = (f[i] + f[i - one]) % MOD
        if i >= zero: f[i] = (f[i] + f[i - zero]) % MOD
    return sum(f[low:]) % MOD


相关文章
|
3天前
|
存储 算法 安全
【刷题】 leetcode 面试题 01.06 字符串压缩
来看效果: 非常好!!!过啦!!!
25 5
【刷题】 leetcode 面试题 01.06 字符串压缩
|
3天前
leetcode代码记录(删除字符串中的所有相邻重复项
leetcode代码记录(删除字符串中的所有相邻重复项
11 0
|
3天前
[leetcode~数位动态规划] 2719. 统计整数数目 hard
[leetcode~数位动态规划] 2719. 统计整数数目 hard
|
3天前
|
算法
代码随想录算法训练营第五十五天 | LeetCode 583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结
代码随想录算法训练营第五十五天 | LeetCode 583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结
24 1
|
3天前
|
存储 编译器 Linux
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
|
3天前
|
机器学习/深度学习 索引
【力扣】387. 字符串中的第一个唯一字符
【力扣】387. 字符串中的第一个唯一字符
|
3天前
leetcode 2520 统计能整除数字的位数
leetcode 2520 统计能整除数字的位数
5 0
|
3天前
|
存储
leetcode2744. 最大字符串配对数目
leetcode2744. 最大字符串配对数目
17 0
|
3天前
leetcode2376. 统计特殊整数
leetcode2376. 统计特殊整数
15 1