SWE · Campus VO Coding

Bloomberg 01* 模式串:列举所有二进制替换结果

对每个 * 做 0/1 分支,说明结果数 2^k 与空串、连续通配符及去重边界。

题目重点:对每个 * 做 0/1 分支,说明结果数 2^k 与空串、连续通配符及去重边界。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 训练版输入仅含 0、1、*,每个 * 独立替换为一位;按左到右 0 分支再 1 分支输出。
  • 不同替换选择得到不同长度相同的字符串,通常无需去重;非法字符直接报错。

解题路线

  1. 维护部分结果列表,扫描固定字符时在每个前缀后附该字符;遇 * 时把每个前缀复制为加 0 和加 1 两条。
  2. 或用 DFS(path,index) 递归分叉,输出可流式 yield;若结果很多,显式列表会耗指数空间。
  3. k 个星号产生 2^k 条,每条长度 n;计算复杂度时必须包含结果复制成本。

手动走一遍

01*01* 依序生成 010010、010011、011010、011011。空输入只有一个结果:空串。

Python 参考实现

下面的代码按上文假设实现,适合本地运行并追加自己的测试用例。

代码区可横向滚动;使用键盘时,先聚焦代码区再按方向键查看。

def expand_bits(pattern):
    """Replace each * with 0 or 1, in left-to-right binary choice order."""
    result = [""]
    for char in pattern:
        if char == "*":
            result = [prefix + bit for prefix in result for bit in "01"]
        elif char in "01":
            result = [prefix + char for prefix in result]
        else:
            raise ValueError("pattern must contain only 0, 1, *")
    return result

复杂度

k 个通配符时输出有 2^k 个长度 n 的字符串,时间与输出空间 O(n·2^k);流式 DFS 工作栈 O(n) 但总输出仍指数。

易错点与追问

容易失分的边界

  • 只生成一条替换。
  • 多个 * 被错误地绑定为相同 bit。
  • 忘记空输入的一个空结果。
  • 声称可显式输出所有结果仍只占 O(n) 总空间。

继续深挖

  • 只要第 m 个结果能否直接计算?
  • 只统计结果数量如何防整数溢出?
  • 如果 * 可匹配空串或多位会怎样?
✓已复制微信号!