20.有效的括号

本文深入探讨了括号匹配的有效性判断算法,通过使用栈结构实现括号的正确顺序闭合验证,提供了Python代码示例并详细解释了其工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。

有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。

注意空字符串可被认为是有效字符串。

示例 1:
输入: “()”
输出: true

示例 2:
输入: “()[]{}”
输出: true

示例 3:
输入: “(]”
输出: false

示例 4:
输入: “([)]”
输出: false

示例 5:
输入: “{[]}”
输出: true

class Solution():
    def isValid(self, s: str):
        
        left_str = ['(', '{', '[']
        right_str = [')', '}', ']']
        stack = []
        for ch in s:
            if ch in left_str:
                stack.append(ch)
            elif ch in right_str:
                if len(stack) <= 0:
                    return False
                if left_str.index(stack.pop()) != right_str.index(ch):
                    return False
        return len(stack) == 0

第一次使用leetcode编辑代码,使用过程充满坎坷,本人从c/c++转python学习,对功能强大的python语言也只是略知皮毛。在以前的学习中好像也没有接触到比较系统的学习,看到力扣大神各种秀代码,我只能惊呼666!自己需要学习的东西还是太多了,好吧,话归正题,第一次看到这种题有些懵逼,看到大家用什么栈操作,对于没有数据结构基础的我来说真是如阅天书。我自己的理解是:1、括号数必为偶数,才能保证两两匹配,所以首先看len(chars)能不能被2整除,2、若能被2整除,有匹配的可能,再看匹配的顺序是否正确,因为涉及到括号的嵌套,我仔细想了下,按照从左到右的顺序,可分为一个或多个嵌套括号块,每一个括号块都是从左小、中、大括号开始,最内层的括号肯定相邻,但是如何知道每个嵌套括号块最内层的配对括号就成了关键,这样我可以针对每个括号块进行一一配对(用列表索引可不考虑嵌套方式),如果每个括号块都能匹配成功则最终返回True,但是我怎么去区一一匹配呢?
后来经过大神指点和对别人代码的参考,充分利用了list的index、pop实现了配对操作!

list函数释义
list.index(obj)返回obj与list匹配项的索引位置
list.append(obj)返回obj与list匹配项的索引位置
list.pop(n)移除列表中的第n项元素,并返回该元素值,default=-1

左小、中、大括号和右小、中、大括号按照对应位置分别组成两个list。一个正确的括号排序肯定是:每一个括号块最内层嵌套的左小、中、大括号能与对应右括号配对,所以使用两层if-else分支,一层是通过不断append左括号来确定最小内嵌层,如果匹配正确,则从左到右每遍历一个右括号都能与前一个左括号匹配,并pop掉。最后stack能全部pop(配对)则返回True,否则匹配存在无效的括号!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值