20、有效的括号--leetcode

该博客主要讨论了LeetCode中的有效括号问题,通过解释题意和展示示例,提出了利用栈结构解决括号匹配的两种算法思路。第一种算法通过遍历字符串并根据字典中的括号对应关系决定是否入栈,最后检查栈是否为空来判断有效性。第二种算法在第一种基础上尝试用相反数匹配括号并删除已匹配的元素,但效率较低。

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

题目描述

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

有效的字符串需要满足:

  • 1.左括号必须使用相同类型的右括号进行闭合。
  • 2.左括号必须以正确的顺序闭合。
    注意空字符串可以被认为是有效的字符串。
    示例1:
输入:"()"
输出:true

示例2:

输入:"()[]{}"
输出:true

示例3:

输入:"(]"
输出:false

示例4:

输入:"([)]"
输出:false

示例5:

输入:"{[]}"
输出:true

算法设计与分析:

  • 左括号与右括号需要匹配才能成功,毫无疑问需要辅助空间,对于括号匹配的问题使用的数据结构就是栈结构,在Python里面可以使用列表结构来实现,提供两种实现的思路:
  • 第一种伪代码如下:
  • 1、直接匹配,在字典里面定义好匹配括号的对应关系以及初始化一个列表当做栈stack=[]
  • 2、循环遍历传入的字符串,如果字符串s中单个字符c对应所有的左括号"([{",说明这个符号需要先入栈;否则如果stack中的值为空或者括号元素与栈中顶部元素不匹配,说明括号字符串s不是有效的字符串,返回false;否则,右括符与左括符匹配,就将stack中的栈顶元素弹出,循环继续,比较下一个括符元素
  • 3、如果最终stack为空的列表,说明匹配成功,是有效的括符,返回true;若不为空则返回False。
  • 第一种的思路代码实现如下所示:
class Solution:
    def isValid(self, s: str) -> bool:
        # 使用字典来进行匹配
        stk = []
        pair = {")":"(","]":"[","}":"{"}
        # 循环遍历传入的字符串,如果是左括号就加入列表,右括号匹配不成功,返回false,否则将匹配的左括号出栈
        for c in s:
            if c in "([{":
                stk.append(c)
            elif not stk or pair[c] != stk[-1]:
                return False
            else:
                stk.pop()
        return stk == []
  • 第二种思路:
  • (在第一种实现思路的基础之上,可以这样想:还可以如何判断括符匹配,以及如何消掉已经匹配的字符呢? 答案是可以使用数字相反数类对括符进行匹配,使用del 关键字删除栈里面的已经匹配了的括符元素。)
  • python3代码实现如下(运行的结果不如第一种的高效,反而降低很多!)
class Solution:
    def isValid(self, s: str) -> bool:
        # 使用字典来进行匹配
        stk = []
        dict = {"(":1,")":-1,"[":2,"]":-2,"{":3,"}":-3}
        for c in s:
            if len(stk)==0:
                stk.append(c)
            elif dict[c] + dict[stk[-1]] == 0:
                del stk[-1]
            else:
                stk.append(c)
        return len(stk) == 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值