320. Generalized Abbreviation
題目網址:https://leetcode.cn/problems/generalized-abbreviation/
題意:寫一函式來生成一個單字的通用縮寫, 以任意順序返回。
Solution 1:
想法:每個 char 都有「取縮寫 or 不取縮寫」兩種選擇, 其中用
num
代表在word[i]
前面取縮寫的連續 char 數
- 取縮寫:
i + 1
, 且num + 1
, 並進入下一輪遞迴- 不取縮寫:
- 若
num != 0
:
- 將
num
加入到cur
中, 並將num
歸零- 將
word[i]
加入到cur
中, 並進入下一輪遞迴- 若
num == 0
:
- 將
num
歸零- 將
word[i]
加入到cur
中, 並進入下一輪遞迴
class Solution { |
- time:$O(n \cdot 2^n)$
- 每個 char 都有兩種選擇 ➔ 總共 $2^n$ 種
- 建構每一種需 $O(n)$
- space:$O(n)$ ➔ 若不考慮要返回的 array
res
, 則取決於遞迴深度, 最大遞迴深度為n
Solution 2:
想法:同 Solution 1, 由於本題不需剪枝, 且每個 char 都有「取縮寫 or 不取縮寫」兩種選擇, 故用 Bit Manipulation 比較方便(狀態壓縮)。
- 首先, 遍歷
00...0
到11...1
所有n
位的二進位狀態(所有 char 的選擇總共有 $2^n$ 種), 並定義:
- 若某 bit 為
0
, 就代表對應位置的 char 不取縮寫- 若某 bit 為
1
, 就代表對應位置的 char 取縮寫- 若第
i
個 bit 要取縮寫:
- 往後遍歷也要縮寫的連續 char, 直到遇到不縮寫的 char(假設其
index = j
)- 將縮寫的長度加入到
cur
中- 將
i
設為j - 1
➔ 下一輪循環,i
將從j
開始往後遍歷- 若第
i
個 bit 不取縮寫:
- 將
word[i]
加入到cur
中, 並進入下一輪遞迴
class Solution { |
- time:$O(n \cdot 2^n)$
- 每個 char 都有兩種選擇 ➔ 總共 $2^n$ 種
- 建構每一種需 $O(n)$
- space:$O(n)$ ➔ 若不考慮要返回的 array
res
, 則取決於cur
的長度(cur
長度不超過n
)
本部落格所有文章除特別聲明外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Zako's Blog!
評論