題目連結 | 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