ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

LeetCode字符串解码

2022-01-18 19:30:34  阅读:196  来源: 互联网

标签:方括号 示例 解码 括号 拼接 字符串 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有