题目描述
➡ 题目链接 ⬅
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。
示例1:
输入:s = "3[a]2[bc]"
输出:"aaabcbc"
示例2:
输入:s = "3[a2[c]]"
输出:"accaccacc"
解题思路
- 本题存在括号中嵌套括号的情况,故需要从最内部的括号开始生成字符串,即利用栈的先入后出特性解题。
- 算法流程:
- 创建栈
stack
;创建num
,初始值为0
,用于存储数字;创建res
,初始值为''
,用于存储临时结果。遍历字符串s
中的每一个字符i
- 当
i
为数字时,将数字字符转化为int型,做下列后续倍数计算:num = 10 * num + int(i)
- 当
i
为字母时,将字母添加到res尾部 - 当
i
为[
时,将当前的res和num存入栈中,并将num和res分别置0置空 - 当
i
为]
时,进行一次出栈操作,拼接字符串res = cur_res + cur_num * res
,其中:cur_res
为上一个[
到当前[
的字符串cur_num
为当前[
到]
的字符串重复倍数
- 当
- 返回字符串
res
- 创建栈
代码
class Solution:
def decodeString(self, s):
num = 0
stack = []
res = ''
for i in s:
if '0' <= i <= '9':
num = 10 * num + int(i)
elif i == '[':
stack.append((res, num))
num = 0
res = ''
elif i == ']':
cur_res, cur_num = stack.pop()
res = cur_res + cur_num * res
else:
res += i
return res
时间复杂度分析
- 使用一次
for
循环遍历字符串s
- 时间复杂度为O(N)