2266. 统计打字方案数
题目链接 | 2266. 统计打字方案数 |
---|---|
思路 | 动态规划-“爬楼梯”变体 |
题解链接 | 分组 + 线性 DP + 乘法原理(Python/Go/C++/Java) |
关键点 | 1. 预处理类“斐波拉契数组” 2. 区分“79”及其他数字 |
时间复杂度 | \(O(n)\) |
空间复杂度 | \(O(1)\) |
代码实现:
MOD = 1_000_000_007
f = [1, 1, 2, 4]
g = [1, 1, 2, 4]
for _ in range(10 ** 5 - 3):
f.append((f[-1]+f[-2]+f[-3]) % MOD)
g.append((g[-1]+g[-2]+g[-3]+g[-4]) % MOD)
class Solution:
def countTexts(self, pressedKeys: str) -> int:
answer = 1
for ch, s in groupby(pressedKeys):
m = len(list(s))
answer = answer * (
g[m] if ch in "79" else f[m]
) % MOD
return answer