← 返回博客列表
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),用模板化的思维秒杀此类字符串处理题。

获取帮助