leetcode394.字符串解码(Python实现)

题目:字符串解码
题目来源:Leetcode
在这里插入图片描述
此题由于保证了输入一定是有效的,因此我们可以不必考虑括号失配的情形。
由于存在括号嵌套的情况,因此我们不能简单的从左到右匹配输出,而是存在内层括号时,我们应该先算出内层括号中的字符串解码然后再由外层计算,这显然很符合栈 “先进后出”的特性。
对输入字符串s进行遍历,有如下情形:

  1. 当前字符为数字,那么我们将其累加起来,用做其后【…】字符串出现的次数
  2. 当前字符为普通字符,我们用一个临时结果集先将其连接
  3. 当前字符为 “【”,显然此时我们要进入括号内层了,所以进内层前,我们将之前的倍数和之前的临时结果集先放入栈中,根据栈的特性,我们会先算完内层才会计算外层
  4. 当前字符为 “】”,此时,表示当前某一内层【…】已匹配完,我们向上弹出,将入括号上的倍数*【…】该括号内的内容并加上之前的临时结果集即可

栈实现的代码如下:

    def decodeString(self, s: str) -> str:
        stack, res, count = [], '', 0
        for c in s:
            if '0' <= c <= '9':
                count = count*10 + int(c)
            # 出现左括号进栈时,同时将当前的结果集和倍数也入栈,
            # 然后将当前结果集和倍数清0,开始内层匹配
            elif c == '[':
                stack.append([res, count])
                res, count = '', 0
            # 出现右括号出栈时,还要加上进栈前的结果集
            elif c == ']':
                tmpRes, tmpCount = stack.pop()
                res = tmpRes + tmpCount * res
            else:
                res += c
        return res

递归实现思路和栈差不多:

  1. 我们设置一个pos指针,初始指向第一个字符
  2. 当出现 “【”时,开启下一层递归
  3. 出现 “】”时,向上返回一层,同时返回此时的pos指针位置
    def decodeString_dfs(self, s: str) -> str:
        def dfs(pos):
            res, count = '', 0
            while pos < len(s):
                if '0' <= s[pos] <= '9':
                    count = count * 10 + int(s[pos])
                elif s[pos] == '[':
                    tmp_res, pos = dfs(pos+1)
                    res += tmp_res * count
                    count = 0
                elif s[pos] == ']':
                    return res, pos
                else:
                    res += s[pos]
                pos += 1
            return res
        return dfs(0)
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值