← 返回博客列表
Stripe

Stripe 面試真題解析:Brace Expansion(花括號展開)

2025-12-27

這道題靈感來源於 Bash Shell 的 brace expansion 功能。它不僅出現在 Stripe 面試中,也是 Google 等大廠的高頻演算法題。它考察的是**遞迴(Recursion)字串解析(Parsing)**能力。

題目描述

實作一個函數,將包含花括號 {} 的字串展開為所有可能的組合列表。

規則

  1. 逗號分隔:花括號內的內容由逗號分隔,表示可選的項目。
    • {a,b,c} -> ["a", "b", "c"]
  2. 前後綴:花括號外的部分會作為前綴或後綴附加到每個選項上。
    • pre{a,b}post -> ["preapost", "prebpost"]
  3. 嵌套與並列:支援多個花括號並列,或者嵌套(部分題目變種支援嵌套)。
    • {a,b}{1,2} -> ["a1", "a2", "b1", "b2"] (笛卡爾積)

範例

Input: "{a,b}c{d,e}f"
Output: ["acdf", "acef", "bcdf", "bcef"]

oavoservice 解題思路分析

這道題可以看作是一個**深度優先搜尋(DFS)回溯(Backtracking)**問題。

1. 遞迴策略

我們需要找到字串中第一個完整的 {...} 結構。

對於 options 中的每一個 opt,我們生成一個新的字串 pre + opt + post。 然後對這個新字串繼續遞迴調用展開函數,直到字串中不再包含 {}

2. 處理並列括號

例如 {a,b}{1,2}

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),用模板化的思維秒殺此類字串處理題。

獲取幫助