1、题目描述:
2、题解:
建议同时做猿辅导笔试题:辅助栈 解压字符串
方法1:辅助栈
思路:
用辅助栈
构建辅助栈stack,
遍历s中的每个字符c:
1、若c为字母,res += c,直接在res后加c,表示拼接字符
2、若c为数字,将c转化为数字multi,用来计算倍数
3、若c为'[':
将res,multi都入栈,表示保存'['之前的字符串和倍数
并分别置0,表示即将记录'['里的字符串和倍数
4、若c为']':
last_res,cur_multi = stack.pop(),表示把最后一次入栈的字符串和倍数取出来(也就是取出保存的'['之前的字符串和倍数)
res = last_res + cur_multi * res ,表示拼接字符
返回字符串res
class Solution:
def decodeString(self, s: str) -> str:
#辅助栈
res ,multi ,stack = '',0,[]
if not s:return res
for c in s:
if '0' <= c <= '9':
multi = multi * 10 + int(c)
elif c == '[':
stack.append([res,multi])
res,multi = '',0
elif c == ']':
last_res,cur_multi = stack.pop()
res = last_res + cur_multi * res
else:
res += c
return res
方法2:深度优先搜索DFS
思路:
需要遍历 s:
1、当s[i] == '[',开启递归:
i,temp = dfs(s,i+1),表示记录[...]内的字符串temp和递归后新的下标i
res = res + temp * multi, 执行拼接
让multi归0,表示此次拼接结束,为接下来的拼接做准备
2、当s[i] == ']':
return i,res 表示返回记录的']'的下标,和']'对应的'['内的字符串
3、当 '0' <= s[i] <= '9'时:
multi = multi * 10 + int(s[i]),表示s[i]为数字,就更新倍数multi
4、当s[i]为字符时:
res += s[i],表示字符拼接
i += 1 继续看下一个字符
注意:调用dfs:dfs(s,0),也就是从下标0开始,依次解码字符串s
Python代码如下:
class Solution:
def decodeString(self, s: str) -> str:
#深度优先搜索,dfs函数表示解码[...]之间的字符
def dfs(s,i):
res ,multi = '',0
while i < len(s):
if s[i] == '[':
i,temp = dfs(s,i+1)
res += multi * temp
multi = 0
elif s[i] == ']':
return i,res
elif '0' <= s[i] <= '9':
multi = multi * 10 + int(s[i])
else:
res += s[i]
i += 1
return res
3、复杂度分析:
方法1:
时间复杂度:O(N)
空间复杂度:O(N)
方法2:
时间复杂度:O(N)
空间复杂度:O(N)