0
点赞
收藏
分享

微信扫一扫

(leetcode)Python字符串解码

两岁时就很帅 2022-02-22 阅读 196

(leetcode)Python字符串解码

题目
在这里插入图片描述

题目大意

要求我们输出一个新的字符串,被中括号包起来的字符串数量要乘以左中括号前面的数字,例如"3[a]",在输出的字符串中应该为"aaa"。

如果有多重中括号包围,就先算里面的,再算外面的,例如"3[a2[b]]",它的解码步骤为:

  1. “2[b]”→"bb",得到"3[abb]";
  2. “3[abb]”→"abbabbabb"。

解决方法

这个问题的难点主要在于以下两点:

  • 如何让[]和数字表现出它们的功能。
  • 如何解决多重嵌套的问题

为了解决以上问题,可以运用有关栈的方法,用于将循环所经过的信息给先储存起来。

现在假设输入的s是"3[a]"。

#首先创建一个栈和两个变量
stack = []   #建立空栈,储存中括号更外层信息
num = 0      #储存数字
result = ""   #储存字符,在最后可作为返回结果

解码得从最里面的中括号开始进行,所以说,循环遇到‘[’时,要将这之前所储存的数字和字符都存入栈中,这样才能在遇到’]'时直接进行解码。

#开始循环
for ch in s:
    
    #当遇到的是数字时
    if ch.isdigit():
        num = num*10+int(ch)
	#根据该公式可顺利将个位数和以外的数转换,比如"30"、"100"。
    
    #当遇到了"["与"]"
    elif ch == '[':     
        stack.append((result,num))  #将字符与数字打包,入栈
        result = ""      #字符与数字清零
        num = 0
	elif ch == ']':    
        w,s = stack.pop()
        result = s+int(w)*m #这里要注意顺序不能搞反
    
    #遇到字母时,直接加入result
    else:
        result += ch
return result

比如当s=”aa4[3[bc]]“,当遇到了’]‘时,可以保证最起码前面有一个’[’,而且在这之前的"aa4[3"都被打包送进了栈中,也就是说当下情况为:

stack:[(‘aa’,4),(,3)];num :0;result:“bc”

这时便可以进行解码。根据以上代码,通过pop函数弹出(,3),此时:

stack→[(‘aa’,4)],并得到w="",m=3。

之后便可得到一个result=“bcbcbc”,之后的步骤也如上所述。

举报

相关推荐

0 条评论