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

小结:

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

posted @   JunanP  阅读(11)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示