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