Oracle Health / OCI SWE · VO Coding

Oracle Health 字符串解码:按 k[encoded_string] 嵌套展开

按完整英文题面和另一篇 IC4 追记还原方括号重复规则,纠正“LC39”编号误写并用栈处理嵌套。

题目重点:按完整英文题面和另一篇 IC4 追记还原方括号重复规则,纠正“LC39”编号误写并用栈处理嵌套。

题意与假设

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

  • 合法输入只含英文字母、十进制重复次数与方括号,k 为正;字母可出现在括号外,数字只出现在 k 前。
  • 展示的通用训练代码也检查部分非法输入;题目保证输入有效,故非法行为不作为原题要求。输出长度至多 10^5。

解题路线

  1. 扫描数字时累积多位 k;遇 [ 把当前已解码前缀和 k 压栈,再从空字符串开始解内部内容。
  2. 遇 ] 弹出上一层前缀与次数,把当前层内容重复 k 次并接回上一层。遇普通字母追加当前层。
  3. 栈深对应未闭合方括号层数;每次 ] 恢复上一层,最终栈空得到完整解码结果。输入保证合法时不必猜测 5abc 这类无方括号写法。
  4. 若输出长度上界未知,拼接可能产生巨大内存,应在重复前累计长度并限制;本题上界 10^5 可直接构造。

手动走一遍

3[a2[c]] 先解内层 2[c]→cc,再形成 acc,外层重复三次得 accaccacc。题目明确 5abc 不应视作合法编码,不能用简单数字后取下一个字母的规则代替。

Python 参考实现

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

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

def decode_string(encoded):
    """Decode nested k[text] groups; letters outside groups pass through."""
    if not isinstance(encoded, str):
        raise ValueError("encoded must be a string")
    stack = []
    current = []
    count = 0
    has_count = False
    for char in encoded:
        if char.isdigit():
            count = count * 10 + int(char)
            has_count = True
        elif char == "[":
            if not has_count:
                raise ValueError("missing repeat count")
            stack.append((current, count))
            current = []
            count = 0
            has_count = False
        elif char == "]":
            if has_count or not stack:
                raise ValueError("unbalanced or misplaced bracket")
            previous, repeat = stack.pop()
            current = previous + ["".join(current) * repeat]
        else:
            if has_count or not (char.isascii() and char.isalpha()):
                raise ValueError("invalid encoded character")
            current.append(char)
    if stack or has_count:
        raise ValueError("incomplete encoded string")
    return "".join(current)

复杂度

输入长度 N、输出长度 M,扫描与构造约 O(N+M) 时间、O(N+M) 空间;嵌套深度 D 贡献 O(D) 栈。Python 字符串重复创建量仍受 M 上界约束。

易错点与追问

容易失分的边界

  • 依据错误的 LC39 标号按 Combination Sum 准备,而忽略帖中完整字符串题面。
  • 把 5abc、6d 当合法示例,与题目指出的方括号规则冲突。
  • 只处理单层或一位重复次数,嵌套时前缀丢失。

继续深挖

  • 若输出可能达到数 GB,如何做长度检查、流式输出或懒展开?
  • 如果原文字母允许数字,语法要如何改变才能无歧义?
✓已复制微信号!