其他分享
首页 > 其他分享> > LeetCode字符串解码

LeetCode字符串解码

作者:互联网

394. 字符串解码

给定一个经过编码的字符串,返回它解码后的字符串。

编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。

你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。

此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。

示例 1:

输入:s = "3[a]2[bc]"输出:"aaabcbc"

示例 2:

输入:s = "3[a2[c]]"输出:"accaccacc"

示例 3:

输入:s = "2[abc]3[cd]ef"输出:"abcabccdcdcdef"

示例 4:

输入:s = "abc3[cd]xyz"输出:"abccdcdcdxyz"

思路:

  这道题的题意是很好理解的,但难点就是不知道怎么把思路交给代码来实现。如果题目中给的方括号都是顺序的,比如例1,例3的样子,我们倒是还好做;但它还有嵌套的形式,如例2的“3[a2[c]]”,我们就有点难处理了。

  为了把所有方括号出现的形式都处理到,尤其是处理嵌套的形式,我们需要使用这一数据结构。

  思路就是:我们遍历这个字符串,并收集好字母和数字信息,一旦我们遇到了左括号[,我们就把之前收集的字母和数字信息压入栈,然后开始收集括号里的信息;等后面遇到了右括号,我们就拿出来压入栈的字母和数字与在括号中收集的信息进行拼接。使用栈的好处就在于即使是遇到了嵌套的形式,我们依然可以处理,大不了在栈里多压几层。

  将字符串拼接的方式也很简单,我们存入栈的时候按(字符串1,数字)的格式存放,对于括号中收集到的字符串2,我们可以得到:结果=字符串1+数字*字符串2。

代码:

class Solution(object):

    def decodeString(self, s):

        stack=[]

        mult=0#定义一个当前数字

        res=''#和一个当前字符串

        for ss in s:#开始遍历

            if '0'<=ss and ss<='9':#遇到数字,就连起来,只不过数字的连法是*10再加

                mult = mult*10+int(ss)

            elif 'a'<=ss and ss<='z':#遇到字母,也连起来

                res = res+ss

            elif ss=='[':#遇到左括号,将元组(字母,数字)的顺序放进去

                stack.append((res,mult))#放完之后,数字,字母都清空

                res=''

                mult=0

            elif ss==']':#遇到右括号,stack pop出一个,对于pop出的结果

                last_res,last_mult = stack.pop()#进行拼接

                #新结果 = 前字母 + 前数字*现字母   

                res = last_res+last_mult*res

        return res

小结:

  这一题关键是记住用栈来做。然后是一些细节上的处理,比如什么时候压入栈,如何拼接(其实拼接方式和题意完全一致,也很好理解)等。一半理解一半记忆去做应该是最快的。

标签:方括号,示例,解码,括号,拼接,字符串,LeetCode,输入
来源: https://blog.csdn.net/weixin_44492824/article/details/122566712