leetcode 394【字符串解码】
题目链接
https://leetcode-cn.com/problems/decode-string/
解题思路与代码思路:
栈法
这道题难点是可以内嵌括号,需要从内向外去拼接字符串,与栈的先入后出的特性对应。
- 使用stack记录前一个框的multi和res,res记录字符串结果,multi记录数字
- 每次碰到"["都把前一个multi和res记录下来,并重置multi和res
- 碰到数字就记录下multi,这里乘以10是为了包括这个数字可能不止是个位
- 碰到字母就直接把res和该字母连接
- 碰到"]"就pop出stack的一个记录,属于前一个框的记录,multi是当前res的倍数,而last_res是数字前面的字母
还存在递归法和正则表达式的方法,暂时不记录。
代码:
栈法
def decodeString(self,s):
stack = []
res = ''
multi = 0
for i in s:
if i == '[':
stack.append([multi,res])
res,multi = "",0
elif i == ']':
cur_multi,last_res = stack.pop()
res = last_res + cur_multi * res
elif i.isdigit():
multi = multi * 10 + int(i) #如果是几十位数以上
else:
res += i
return res
复 杂 度 分 析 : \color{red}{复杂度分析:} 复杂度分析:
- 栈法
- 时间复杂度:需要遍历整个字符串s,O(N)
- 空间复杂度:极端情况下需要线性空间,O(N),例3[3[3[b]]]