【leetcode 394】【字符串解码】

leetcode 394【字符串解码】

题目链接

https://leetcode-cn.com/problems/decode-string/


解题思路与代码思路:

栈法

这道题难点是可以内嵌括号,需要从内向外去拼接字符串,与栈的先入后出的特性对应。

  1. 使用stack记录前一个框的multi和res,res记录字符串结果,multi记录数字
  2. 每次碰到"["都把前一个multi和res记录下来,并重置multi和res
  3. 碰到数字就记录下multi,这里乘以10是为了包括这个数字可能不止是个位
  4. 碰到字母就直接把res和该字母连接
  5. 碰到"]"就pop出stack的一个记录,属于前一个框的记录,multi是当前res的倍数,而last_res是数字前面的字母

还存在递归法和正则表达式的方法,暂时不记录。


代码:

栈法
def decodeString(self,s):
    stack = []
    res = ''
    multi = 0

    for i in s:
        if i == '[':
            stack.append([multi,res])
            res,multi = "",0
        elif i == ']':
            cur_multi,last_res = stack.pop()
            res = last_res + cur_multi * res
        elif i.isdigit():  
            multi = multi * 10 + int(i)   #如果是几十位数以上
        else:
            res += i

    return res
        
        
复 杂 度 分 析 : \color{red}{复杂度分析:}
  1. 栈法
  • 时间复杂度:需要遍历整个字符串s,O(N)
  • 空间复杂度:极端情况下需要线性空间,O(N),例3[3[3[b]]]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值