题目:
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: k[encoded_string]
,表示其中方括号内部的 encoded_string
正好重复 k
次。注意 k
保证为正整数。
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k
,例如不会出现像 3a
或 2[4]
的输入。
这个问题类似于解析嵌套的括号表达式,需要栈来处理嵌套的结构。遇到数字时,需要解析出完整的数字,因为数字可能不止一位。遇到 [ 时,开始记录需要重复的字符串。遇到 ] 时,将栈顶的数字和字符串弹出,进行重复操作,并将结果和前面的字符串合并。
思路:
初始化:存储之前的字符串和数字,字符串正在解析的字符串,以及正在解析的数字
遍历字符串:
如果是数字,更新当前的数字;
如果是[ 将当前的字符串和数字压入栈中,并重置;
如果是 ] 弹出栈顶的字符串和数字,将字符串重复num次并于之前的字符串进行拼接
如果是字母,直接添加到当前字符串
class Solution(object):
def decodeString(self, s):
"""
:type s: str
:rtype: str
"""
stack=[] #用于保存遇到 [ 时的当前字符串和数字
current_string="" #当前正在构建的字符串
current_num=0 #当前正在解析的数字
for char in s:
if char.isdigit(): #如果字符char是数字(0-9)
current_num=current_num*10+int(char) #处理多位数,比如 "123" 会依次解析为 1 → 12 → 123
elif char=="[":
stack.append((current_string,current_num))
current_string=''
current_num=0
elif char=="]":
previous_string,num=stack.pop()#从栈中弹出之前保存的字符串和数字
current_string=previous_string+current_string*num#将当前字符串重复 num 次,并附加到 previous_string 后面
else:#如果当前字符是字母
current_string+=char
return current_string #当遇到 [ 就保存当前状态,遇到 ] 就弹出状态并处理重复
时间复杂度:O(n),n是解码后的字符串长度,每个字符最多被处理一次
空间复杂度:O(n)