這道題靈感來源於 Bash Shell 的 brace expansion 功能。它不僅出現在 Stripe 面試中,也是 Google 等大廠的高頻演算法題。它考察的是**遞迴(Recursion)與字串解析(Parsing)**能力。
題目描述
實作一個函數,將包含花括號 {} 的字串展開為所有可能的組合列表。
規則
- 逗號分隔:花括號內的內容由逗號分隔,表示可選的項目。
{a,b,c}->["a", "b", "c"]
- 前後綴:花括號外的部分會作為前綴或後綴附加到每個選項上。
pre{a,b}post->["preapost", "prebpost"]
- 嵌套與並列:支援多個花括號並列,或者嵌套(部分題目變種支援嵌套)。
{a,b}{1,2}->["a1", "a2", "b1", "b2"](笛卡爾積)
範例
Input: "{a,b}c{d,e}f"
Output: ["acdf", "acef", "bcdf", "bcef"]
oavoservice 解題思路分析
這道題可以看作是一個**深度優先搜尋(DFS)或回溯(Backtracking)**問題。
1. 遞迴策略
我們需要找到字串中第一個完整的 {...} 結構。
pre: 花括號前的部分。options: 花括號內解析出的列表。post: 花括號後的部分。
對於 options 中的每一個 opt,我們生成一個新的字串 pre + opt + post。
然後對這個新字串繼續遞迴調用展開函數,直到字串中不再包含 {}。
2. 處理並列括號
例如 {a,b}{1,2}。
- 第一次展開:
a{1,2},b{1,2} - 第二次展開:
a1, a2,b1, b2
3. 堆疊(Stack)方法(非遞迴)
也可以使用堆疊來模擬。
- 掃描字串,遇到
{進棧。 - 遇到
}出棧,處理當前的選項列表,並與棧頂元素進行笛卡爾積合併。
程式碼片段 (DFS Python)
def expand(s):
if '{' not in s:
return [s]
# 找到第一個右括號 '}'
r = s.find('}')
# 找到該右括號對應的左括號 '{'
l = s.rfind('{', 0, r)
# 提取各部分
prefix = s[:l]
suffix = s[r+1:]
options = s[l+1:r].split(',')
res = []
for opt in options:
# 拼接並遞迴
# 注意:這裡我們消除了最內層的一對括號,繼續遞迴處理剩餘部分
res.extend(expand(prefix + opt + suffix))
# 去重並排序(題目通常要求)
return sorted(list(set(res)))
注意: 上述簡單 DFS 適用於嵌套不深的情況。如果括號嵌套非常複雜,或者需要嚴格的從左到右解析,可能需要更複雜的 Parser 邏輯。
演算法題總是寫不對邊界條件?
oavoservice 提供 HackerRank / CodeSignal 滿分代寫與輔助服務,同時也提供一對一的程式碼指導。我們會教你如何快速識別題目模式(Pattern Recognition),用模板化的思維秒殺此類字串處理題。