91. Decode Ways
題目網址:https://leetcode.cn/problems/decode-ways/
題意:給一只含數字的非空 string
s,計算並返回解碼的方法數一則包含字母
A-Z的訊息透過以下 mapping 進行編碼:
要解碼已編碼的訊息, 其所有數字必須基於上述 mapping 的方法,反向 mapping 回字母(可能有多種方法)。例如 : “11106” 可以 mapping 為:
AAJF將訊息分組為(1 1 10 6)KJF將訊息分組為(11 10 6)注意:訊息並不能分組為
(1 11 06), 因為06並不能 mapping 為F, 這是因為6和06在 mapping 中並不等價答案保證符合 32-bit 整數的範圍

Solution 1:(TLE 無法通過)
想法:利用 DFS, 其中每個 char 都有兩種選擇:
- 自己一組, 前提是自己不能為
'0'。若為'0', 則一定要跟其他 char 一組- 自己 + 後面一個 char 一組, 前提是
"10" <= substring <="26"
class Solution { |
- time:$O(n \cdot 2^n)$
- $O(2^n)$ : 每一個 char 有兩種選擇, 一種是自己一組, 另外是和後面一個 char 一組, 總共 $2^n$ 種
- 建構每一種狀況需花 $O(n)$ time
- space:$O(n)$ ➔ 取決於遞迴深度, 最大遞迴深度為
n
Solution 2:
想法:利用 DP, 其中
dp[i]代表s[0~(i-1)]的解碼方法數
class Solution { |
- time:$O(n)$ ➔ for loop
- space:$O(n)$ ➔
dp
Solution 3:
想法:改進 Solution 2,
dp[i]最多用到dp[i - 1]和dp[i - 2], 因此不需要開到n個空間
class Solution { |
- time:$O(n)$ ➔ for loop
- space:$O(1)$ ➔ 只需常數空間
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Zako's Blog!
評論

