LeetCode字符串解码
作者:互联网
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: 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