菜菜的刷题日记 | 20.有效的括号(B站笔试题)

请添加图片描述

系列索引菜菜的刷题日记 | 被LeetCode用Python狂虐的那段日子

今天冒雨约会哈哈哈,真是绝绝子啊,最后电车都扔商场门口回来了,补道打卡题,我只能说这道简单题对我来说还不是可以一次AC的

【题目】

在这里插入图片描述

题目链接:https://leetcode-cn.com/problems/valid-parentheses/

【我的代码】

首先看结果,感觉自己为了把这道题A掉没考虑太多复杂度,结果时间还让我比较满意(个人目前正在学习,大佬勿嘲~)
在这里插入图片描述
那就简单说一下我的思路,主要是用了的思想,这里我创建了一个列表和一个指针,按照我对栈先进先出的理解,当left(也就是左边的括号)入栈以后,再碰到右边的括号时就去对比,比如栈中是[’(’],当下一个是)时即i = ‘)’,那么看是否匹配,如果匹配就出栈,否则就是发生不匹配的情况直接false。这道题判断len(zhan)==0的是我后加的,在提交时我没考虑到直接上来就是右括号,导致报错,这里处理一下就行了。

class Solution:
    def isValid(self, s: str) -> bool:
        left = ['(', '{', '[']
        right = [')', '}', ']']
        zhan = []
        pt = -1
        for i in s:
            if i in left:
                zhan.append(i)
                pt += 1
            if i in right:
                if len(zhan) == 0:
                    return False
                if i == right[left.index(zhan[pt])]:
                    zhan.pop()
                    pt -= 1
                else:
                    return False
        return True if len(zhan) == 0 else False

【官方思路】

在这里插入图片描述
官方大大的题解是使用栈的思想,看了我的思路出发点是正确的,这里使用了哈希表,而我只是使用了两个列表,可以看出我对数据结构掌握的不是很好,需要再复习!另外奇数直接false我没想到,这一点对提升效率太关键了!

class Solution:
    def isValid(self, s: str) -> bool:
        if len(s) % 2 == 1:
            return False
        
        pairs = {
            ")": "(",
            "]": "[",
            "}": "{",
        }
        stack = list()
        for ch in s:
            if ch in pairs:
                if not stack or stack[-1] != pairs[ch]:
                    return False
                stack.pop()
            else:
                stack.append(ch)
        
        return not stack

【参考代码】

class Solution:
    def isValid(self, s: str) -> bool:
        stk = []
        for c in s:
            # 如果c是 ({[ 则入栈
            if c in ['(','[','{']:
                stk.append(c)
            # 如果c是 )}] 并且栈不为空 则 判断栈顶是否为与之对应的左括号 是则出栈,不是则返回fasle
            elif c == ')' and stk and stk[-1] == '(':
                stk.pop();
            elif c == ']' and stk and stk[-1] == '[':
                stk.pop();
            elif c == '}' and stk and stk[-1] == '{':
                stk.pop()
            else:
                # 如果c是 )}] 栈为空 那么返回false
                # 如果c是 )}] 栈不为空, 但是 栈顶不是与c对应的左括号 那么返回false
                return False
        # 例如"(){}[" ,如果最后栈不为空,那么就是有多余的左括号了
        return not stk

两个代码基本一致,供大家翻阅

class Solution:
    def isValid(self, s: str) -> bool:
        if len(s) % 2 == 1:
            return False
        stack = list()
        for ch in s:
            if ch == '(' or ch == '[' or ch == '{':
                stack.append(ch)
            elif ch == ')':
                if len(stack) !=0 and stack[-1] == '(':
                    stack.pop()
                else:
                    return False
            elif ch == ']':
                if len(stack) !=0 and stack[-1] == '[':
                    stack.pop()
                else:
                    return False
            elif ch == '}':
                if len(stack) !=0 and stack[-1] == '{':
                    stack.pop()
                else:
                    return False
        if len(stack) == 0:
            return True
        else:
            return False

【思考】

早睡早起是我遥不可及的梦

Python力扣题解系列持续更新,欢迎点赞收藏关注

上一篇:菜菜的刷题日记 | 12.整数转罗马数字
下一篇:菜菜的刷题日记 | 蓝桥杯 — 十六进制转八进制(纯手撕版)附进制转换笔记

本人水平有限,文章中不足之处欢迎下方👇评论区批评指正~

如果感觉对你有帮助,点个赞👍 支持一下吧 ~

不定期分享 有趣、有料、有营养内容,欢迎 订阅关注 🤝 我的博客 ,期待在这与你相遇 ~

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猿知

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值