有效的括号-栈的括号匹配

1.题目描述

题目链接

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

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。

示例 1:

输入:s = "()"
输出:true

示例 2:

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

示例 3:

输入:s = "(]"
输出:false

示例 4:

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

示例 5:

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

根据题目描述,我们可以括号的匹配是后面的括号先匹配,因此我们使用栈存放左括号,然后判断下一个字符与栈中元素是否匹配。

  • 从字符串s的第一个字符开始遍历
  • 定义栈st, st 为空时,说明没有左括号,只有右括号(eg:)]}),不符合,返回False
  • 如果遍历的字符为左括号,则压入栈st中
  • 比较 当前字符 和 栈中的字符(st.pop()),不相等,则返回 False
  • 以上循环用来判断不符合条件的括号
  • 之后如果 st == [] 则 返回True,否则 返回 False。注意:这里排除 [(, 左括号多的字符串。

2. 编程实现

class Solution:
    def isValid(self, s: str) -> bool:
        parens = "()[]{}"                           # 字符串中含有的所有 括号类型
        open_parens = "([{"                         # 开括号
        opposite = {")": "(", "]": "[", "}": "{"}   # 闭括号对应的开括号

        st = []                                     # 使用列表模拟栈, (左)开括号入栈
        for pr in s:
            if pr not in parens:
                return False                        # 字符串中含有除括号外的其它字符则返回 False
            elif pr in open_parens:                 # pr 如果为开括号 则压入栈 st 中
                st.append(pr)
            elif st == []:                          # 栈st为空,说明没有 左括号,只有右括号(eg:]),返回 False
                return False
            elif st.pop() != opposite[pr]:          # 右括号 和 左括号不匹配 eg:[[ 返回False
                return False
            else:
                pass

        # 检索完之后,如果出现 栈st 还有字符,可能字符串s只有单括号 如[, 返回False
        # if len(st) == 0:
        #     return True
        # else:
        #     return False
        return True if st == [] else False

if __name__ == '__main__':
    solution = Solution()
    res = solution.isValid("(()]}")
    print("res: ", res)

注意:这里不符合的字符串都要进行考虑,比如字符串为空,字符串中 左括号多、右括号多等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值