思路:和有效的括号有点像,使用栈记录,遇到左括号入栈,右括号出栈
遇到括号,入栈存储的元素是(左括号前的字符串,左括号签的数字), 比如abc3[def], 当遇到第一个左括号的时候,压入栈中的是(“abc”, 3), 然后遍历括号里面的字符串def, 当遇到右括号的时候, 从栈里面弹出一个元素(s1, n1), 得到新的字符串为s1+n1*“def”, 也就是abcdefdefdef。对于括号里面嵌套的情况也是同样处理方式。
class Solution:
def decodeString(self, s: str) -> str:
if not s:
return s
n = len(s)
stack = []
res = ""
num = 0
for i in range(n):
if s[i].isdigit(): # 左括号前的数字,不止一位
num = num * 10 + int(s[i])
elif s[i] == "[": # 遇到左括号,入栈(左括号前的字符串,左括号前的数字),每次遇到左括号,res和num都要清空
stack.append((res, num))
res = ""
num = 0
elif s[i] == "]": # 遇到右括号,出栈,拼接之前的字符和新累积的字符
top = stack.pop(-1)
res = top[0] + res * top[1]
elif s[i].isdigit():
continue
else: # 括号内、外的,直接加进结果res
res += s[i]
return res