返回

字符串解码:LeetCode 394 题剖析

前端

引言

字符串解码是一个常见的算法问题,它要求我们根据给定的编码字符串生成原始字符串。LeetCode 394 题就是这样一个问题,它考察了我们的字符串处理能力和算法设计技巧。

理解问题

给定一个字符串 s,其中包含数字和方括号 []。数字代表字符重复的次数,方括号括住的子字符串表示要重复的字符。例如,给定字符串 "3[a]2[bc]", 解码后的字符串为 "aaabcbc"

解决方法

解决 LeetCode 394 题,我们可以使用栈和递归相结合的方法:

  1. 使用栈存储数字和字符:

    • 遍历字符串 s 中的每个字符。
    • 遇到数字时,将其推入栈中。
    • 遇到左方括号 [ 时,将当前栈顶的数字和左方括号 [ 推入栈中。
  2. 使用递归解码子字符串:

    • 遇到右方括号 ] 时,弹出栈顶的数字和左方括号 [,并递归解码左方括号括住的子字符串。
    • 将解码后的子字符串重复数字次,并与栈中其他字符连接起来。

详细示例

考虑字符串 "3[a]2[bc]"

  1. 初始化: 栈为空。
  2. 遍历字符:
    • "3":数字 3 入栈。
    • "a":字符 a 入栈。
    • "3":数字 3 入栈。
    • "[":数字 3 和左方括号 [ 入栈。
    • "b":字符 b 入栈。
    • "c":字符 c 入栈。
    • "2":数字 2 入栈。
    • "]":弹出数字 2 和左方括号 [。递归解码子字符串 `"b[c]"。
  3. 解码子字符串:
    • "[":左方括号入栈。
    • "b":字符 b 入栈。
    • "c":字符 c 入栈。
    • "]":弹出左方括号和数字 1。将子字符串 "bc" 重复 1 次,得到 "bc"
  4. 完成解码:
    • 将解码后的子字符串 "bc" 与栈中其他字符连接起来,得到 "aaabcbc"

代码实现

def decode_string(s):
    stack = []
    result = ""
    num = 0
    for ch in s:
        if ch.isdigit():
            num = num * 10 + int(ch)
        elif ch == "[":
            stack.append(result)
            stack.append(num)
            num = 0
            result = ""
        elif ch == "]":
            num_repeats = stack.pop()
            result = stack.pop() + num_repeats * result
        else:
            result += ch
    return result

结论

LeetCode 394. 字符串解码题考察了我们的字符串处理能力和算法设计技巧。通过使用栈和递归,我们可以高效地解码给定的字符串。通过深入理解问题和逐步实现,我们可以掌握解决此类问题的技巧。