leetcode394.字符串解码『华为2019秋季上机题目』

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)
        

 

 

 

你可能感兴趣的:(leetcode)