题目
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: k[encoded_string]
,表示其中方括号内部的 encoded_string
正好重复 k 次。注意 k 保证为正整数。
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a
或 2[4]
的输入。
例如:
输入:s = "3[a2[c]]"
输出:"accaccacc"
代码
栈运用
题目做的稍微多一点,看到括号相关的时候就会考虑用栈了,感觉这一题用栈挺明显的。
由题意一对方括号前面的数字,就是方括号内部的字符重复的次数。
因此从左往右遍历字符串,只要没遇到]
就入栈;遇到]
就查看栈顶元素,出栈记录所有字符直到遇到[
。要注意这个时候由于栈的先进后出特性,出栈的字符与原本输入的顺序是相反的,之后解码还要注意反转一次顺序。
我们将栈内的[
也出栈,找到前面的第一个数字(由于是字符,所以不能只找前面的第一个数字字符),同上也要注意数字的顺序问题。
将方括号内的字符做相应的重复处理,即完成解码。
class Solution:
def decodeString(self, s: str) -> str:
# 从左往右遍历,只要不是右括号就入栈
# 若遍历到右括号,则往前找到第一个左括号,以及这个左括号的第一个数字,解码后入栈
stack=[]
for i in range(len(s)):
if s[i]!=']':
stack.append(s[i])
else:
tmp=[]
for x in reversed(stack):
if x!='[':
tmp.append(stack.pop())
else:
stack.pop()
# 记录对应这对左括号的数字
L=''
for x in reversed(stack):
if x.isdigit():
L=L+x
stack.pop()
else:
break
n=int(L[::-1]) # 记录数字
tmp.reverse() # 出栈的时候逆序了,所以正确的顺序要反正一次
stack.append(''.join(tmp)*n)
break
return ''.join(stack)