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
posted @ 2024-09-13 00:46  WrRan  阅读(6)  评论(0编辑  收藏  举报