1.题目描述
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。
示例:
s = "3[a]2[bc]", 返回 "aaabcbc".
s = "3[a2[c]]", 返回 "accaccacc".
s = "2[abc]3[cd]ef", 返回 "abcabccdcdcdef".
2.解题思路
设置存储临时结果变量res,字符串的首字符不可能是" [ ",不是字母就是数字,当遇到的是字母,保存在res中,当遇到数字时,保存在k中。当遇到" [ "时,应该跳过这个" [ ",递归下一层,重复上述过程。
递归展开,当遇到 " ] " 时,展开最里层的(k*res),遇到第二个" ] " 时,展开下一层的。
注意:当使用decode(s,i)进行递归时,如果i是个值传递,那么递归回来会变成递归之前的i值+1,但这里应该是i当前的i值加1,这样i才能一直向后走(应该是引用传递,在C++中传入 & i,在Python中传入列表i)
3.代码实现
class Solution(object):
def decode(self,s,i):
res=""
n=len(s)
while i[0] < n and s[i[0]]!="]":
# 遇到字母
if s[i[0]] < "0" or s[i[0]] > "9":
res=res+s[i[0]]
i[0]+=1
# 遇到数字
else:
if s[i[0]] <= "9" and s[i[0]] >= "0":
k = 0
while s[i[0]] <= "9" and s[i[0]] >= "0":
k = k * 10 + int(s[i[0]])
i[0]+= 1
# 跳过"["
i[0]+= 1
t=self.decode(s,i)
# 跳过"]"
i[0]+=1
while k > 0:
res+=t
k-=1
return res
def decodeString(self, s):
"""
:type s: str
:rtype: str
"""
i = []
i.append(0)
return self.decode(s,i)