返回
字符串解码:LeetCode 394 题剖析
前端
2023-09-26 22:39:41
引言
字符串解码是一个常见的算法问题,它要求我们根据给定的编码字符串生成原始字符串。LeetCode 394 题就是这样一个问题,它考察了我们的字符串处理能力和算法设计技巧。
理解问题
给定一个字符串 s
,其中包含数字和方括号 []
。数字代表字符重复的次数,方括号括住的子字符串表示要重复的字符。例如,给定字符串 "3[a]2[bc]"
, 解码后的字符串为 "aaabcbc"
。
解决方法
解决 LeetCode 394 题,我们可以使用栈和递归相结合的方法:
-
使用栈存储数字和字符:
- 遍历字符串
s
中的每个字符。 - 遇到数字时,将其推入栈中。
- 遇到左方括号
[
时,将当前栈顶的数字和左方括号[
推入栈中。
- 遍历字符串
-
使用递归解码子字符串:
- 遇到右方括号
]
时,弹出栈顶的数字和左方括号[
,并递归解码左方括号括住的子字符串。 - 将解码后的子字符串重复数字次,并与栈中其他字符连接起来。
- 遇到右方括号
详细示例
考虑字符串 "3[a]2[bc]"
:
- 初始化: 栈为空。
- 遍历字符:
- "3":数字 3 入栈。
- "a":字符 a 入栈。
- "3":数字 3 入栈。
- "[":数字 3 和左方括号
[
入栈。 - "b":字符 b 入栈。
- "c":字符 c 入栈。
- "2":数字 2 入栈。
- "]":弹出数字 2 和左方括号
[
。递归解码子字符串 `"b[c]"。
- 解码子字符串:
- "[":左方括号入栈。
- "b":字符 b 入栈。
- "c":字符 c 入栈。
- "]":弹出左方括号和数字 1。将子字符串
"bc"
重复 1 次,得到"bc"
。
- 完成解码:
- 将解码后的子字符串
"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. 字符串解码题考察了我们的字符串处理能力和算法设计技巧。通过使用栈和递归,我们可以高效地解码给定的字符串。通过深入理解问题和逐步实现,我们可以掌握解决此类问题的技巧。