统计构造好字符串的方法数-LeetCode
2466. 统计构造好字符串的方法数 - Count Ways To Build Good Strings
🎯 问题描述(来源于LeetCode)
描述:
给你整数 low、high、zero 和 one。请你构造字符串,每次操作可以添加 zero 个 '0' 或添加 one 个 '1'。
求最终字符串的长度在 [low, high] 之间的不同构造方法数。答案对 10^9+7 取模。
说明:
- 空字符串是允许的初始状态。
- 每次操作必须添加恰好
zero个'0'或恰好one个'1',不能部分添加。
示例:
- 示例 1:
1 | 输入: low = 3, high = 3, zero = 1, one = 1 |
- 示例 2:
1 | 输入: low = 2, high = 3, zero = 1, one = 2 |
💻 解题思路
思路:动态规划(爬楼梯变种)
算法步骤
- 定义
dp[i]表示构造长度为i的字符串的不同方法数。 - 初始化
dp[0] = 1(空字符串有一种方法)。 - 对于
i从 1 到high:- 如果
i >= zero,则dp[i] += dp[i - zero]。 - 如果
i >= one,则dp[i] += dp[i - one]。 - 每次加和后取模
mod = 1_000_000_007。
- 如果
- 最终答案 =
(dp[low] + dp[low+1] + ... + dp[high]) % mod。
代码实现
1 | from typing import List |
📊 性能分析
- 时间复杂度:,只需一次遍历。
- 空间复杂度:,存储
dp数组。
思考
本题与爬楼梯问题类似,区别在于步长 zero 和 one 是固定的,且要求统计长度在某个区间内的所有方案数。用户代码使用了优化的写法:先计算当前 dp[i] 等于 dp[i-zero](如果可达),再累加 dp[i-one](如果可达),避免了重复的 + 操作。最后通过切片求和得到区间内所有长度的方案总数,取模返回。该解法清晰高效,是本题的标准答案。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 笺札!






