leetcode5-28每日一题:字符串解码

今天的题目如下所示:
题目
看到这道题的时候有一种似曾相识的感觉,在二月份学数据结构的时候自己写过一个表达式求值的函数,感觉跟这个类似,于是乎就动手,用栈来解决这个问题!
说起来这个用栈来求解的话,思路很简单,遇到[的时候,把它压入栈,然后存储数字和字符,等到遇到]的时候,就把[弹出栈,然后处理数字和字符。
以下是代码:

class Solution:
    def decodeString(self, s: str) -> str:
        #用栈来解决问题
        stack = []
        cache = []
        result = ''
        str_len = len(s)
        i = 0
        before = 0
        while i < str_len:
            if s[i] in "[]":
                if s[i] == "[":
                    before = 1
                    stack.append("[")
                elif s[i] == "]":
                    before = 0
                    stack.pop()
                    if stack != []:
                        alp = cache.pop(-1)
                        num = cache.pop(-1)
                        if cache[-1][0] in "1234567890":
                            cache.append(int(num)*alp)
                        else:
                            cache[-1] += int(num)*alp
                    else:
                        alp = cache.pop(-1)
                        num = cache.pop(-1)
                        result += int(num)*alp
                i += 1
            elif s[i] in "1234567890":
                if before == 2:
                    cache[-1] += s[i]
                else:
                    cache.append(s[i])
                    before = 2
                i += 1
            elif s[i] in "qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM":
                if before == 3:
                    cache[-1] += s[i]
                elif before == 0:
                    if stack != []:
                        cache[-1] += s[i]
                    else:
                        result += s[i]
                else:
                    cache.append(s[i])
                    before = 3
                i += 1
        return result

这个问题说简单是简单,因为就是分情况讨论,但是似乎也没有想象中那么简单,因为写着写着发现要讨论的情况还挺多的,我也是在几次踩坑之后才慢慢把代码完善好的。

情况1

在括号里面我没有考虑到会直接在]后面接一个字母,然后就加了一段代码解决了这个问题。

                elif before == 0:
                    if stack != []:
                        cache[-1] += s[i]
                    else:
                        result += s[i]

情况2

我没有考虑到括号里面开头的竟然又是一个数字,于是乎又加了一段代码解决了这个问题。因为在我设想的情况里面,存储数字和字母的列表应该是数字和字母交替出现,为了达到这个效果,就需要判断一下列表里面最后的那个元素是字母还是数字,如果是数字,那么就要生成一个字母字符串加上去,否则就是要在原来的基础之上延长。

                        if cache[-1][0] in "1234567890":
                            cache.append(int(num)*alp)
                        else:
                            cache[-1] += int(num)*alp

由于leetcode测试案例总会出现一些奇奇怪怪的东西,所以还是得多提交几次才知道自己有哪些遗漏😶
由于我的代码太长了,且效率也不高,于是乎看了一下评论区,发现有一个也是用栈的方法来写的,代码比我的简洁好多,就po上来欣赏一下:
栈处理
还有一个更神奇的方法,是用正则表达式实现的,由于我还没怎么接触过正则表达式,于是就也po上来欣赏一下😀:
正则表达式处理

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值