LeetCode 第 394 题:字符串解码(Decode String)
字数 1230 2025-10-27 16:51:52
LeetCode 第 394 题:字符串解码(Decode String)
题目描述
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。
示例
示例 1:
输入:s = "3[a]2[bc]"
输出:"aaabcbc"
示例 2:
输入:s = "3[a2[c]]"
输出:"accaccacc"
示例 3:
输入:s = "2[abc]3[cd]ef"
输出:"abcabccdcdcdef"
解题思路
这个问题可以用栈(Stack)来处理,因为嵌套的结构(例如 3[a2[c]])需要从内层括号开始解码,这与栈的后进先出(LIFO)特性相符。
我们遍历字符串,遇到非 ] 的字符就压入栈,遇到 ] 时开始出栈,直到遇到 [,这之间的字符就是需要重复的子串;然后继续出栈得到重复的数字(注意数字可能有多位),将子串重复指定次数后,再重新压入栈(因为外层可能还有嵌套)。最后栈中剩下的就是解码后的结果。
详细步骤
-
初始化栈
创建一个栈(比如用列表模拟),用于存储字符和中间结果。 -
遍历字符串的每个字符
- 如果当前字符不是
],直接压入栈。 - 如果当前字符是
],开始解码过程:
a. 从栈中弹出字符,直到遇到[,这些字符组成一个子串(注意顺序是反的,需要反转)。
b. 弹出[。
c. 继续弹出字符,直到栈为空或栈顶不是数字,这些字符是重复次数 k(数字可能有多位,需要从后往前拼接)。
d. 将子串重复 k 次,得到新的字符串。
e. 将新字符串的每个字符重新压入栈(因为可能还有外层嵌套)。
- 如果当前字符不是
-
最终结果
遍历结束后,栈中字符从底到顶连接起来就是解码后的字符串。
举例说明
以 s = "3[a2[c]]" 为例:
- 遍历到
]前,栈是['3', '[', 'a', '2', '[', 'c']。 - 遇到第一个
]:- 弹出直到
[,得到子串"c",k = 2,新串"cc"压回栈:['3', '[', 'a', 'c', 'c']。
- 弹出直到
- 继续遍历到
]:- 弹出直到
[,子串"acc",k = 3,新串"accaccacc"压回栈。
- 弹出直到
- 栈中最终结果
"accaccacc"。
复杂度分析
- 时间复杂度:O(n),n 是输出字符串的长度。
- 空间复杂度:O(n),栈的最大深度可能达到 n。
通过栈处理嵌套结构,每一步确保内层括号先被解码,逻辑清晰且高效。