(leetcode)Python字符串解码
题目
题目大意
要求我们输出一个新的字符串,被中括号包起来的字符串数量要乘以左中括号前面的数字,例如"3[a]",在输出的字符串中应该为"aaa"。
如果有多重中括号包围,就先算里面的,再算外面的,例如"3[a2[b]]",它的解码步骤为:
- “2[b]”→"bb",得到"3[abb]";
- “3[abb]”→"abbabbabb"。
解决方法
这个问题的难点主要在于以下两点:
- 如何让[]和数字表现出它们的功能。
- 如何解决多重嵌套的问题
为了解决以上问题,可以运用有关栈的方法,用于将循环所经过的信息给先储存起来。
现在假设输入的s是"3[a]"。
#首先创建一个栈和两个变量
stack = [] #建立空栈,储存中括号更外层信息
num = 0 #储存数字
result = "" #储存字符,在最后可作为返回结果
解码得从最里面的中括号开始进行,所以说,循环遇到‘[’时,要将这之前所储存的数字和字符都存入栈中,这样才能在遇到’]'时直接进行解码。
#开始循环
for ch in s:
#当遇到的是数字时
if ch.isdigit():
num = num*10+int(ch)
#根据该公式可顺利将个位数和以外的数转换,比如"30"、"100"。
#当遇到了"["与"]"
elif ch == '[':
stack.append((result,num)) #将字符与数字打包,入栈
result = "" #字符与数字清零
num = 0
elif ch == ']':
w,s = stack.pop()
result = s+int(w)*m #这里要注意顺序不能搞反
#遇到字母时,直接加入result
else:
result += ch
return result
比如当s=”aa4[3[bc]]“,当遇到了’]‘时,可以保证最起码前面有一个’[’,而且在这之前的"aa4[3"都被打包送进了栈中,也就是说当下情况为:
stack:[(‘aa’,4),(,3)];num :0;result:“bc”
这时便可以进行解码。根据以上代码,通过pop函数弹出(,3),此时:
stack→[(‘aa’,4)],并得到w="",m=3。
之后便可得到一个result=“bcbcbc”,之后的步骤也如上所述。