【力扣高频题】020.有效的括号

为了给想在秋招突击冲刺的小伙伴加油助威,小编这里准备了一份 Java 八股文面试题,有需要的小伙伴可以 关注公众号,回复关键词 「1024」 获得。

速刷一遍,查漏补缺!!!

系统刷题 的小伙伴也可以点击链接了解下 八股文小程序 ,助力面试顺利,Offer 拿到手软!!!


言归正传,今天我们继续来学习 「力扣高频题」 系列。

20. 有效的括号

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

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

示例 1:

输入: s = “()”

输出: true

示例 2:

输入: s = “()[]{}”

输出: true

示例 3:

输入: s = “(]”

输出: false

  • 提示:
  • 1 <= s.length <= 1 0 4 10^4 104
  • s 仅由括号 ()[]{} 组成

思路分析

学习过数据结构的小伙伴都知道,在栈的应用中就讲到了最经典的括号匹配问题,利用栈先进后出的特性完美适用该问题。

逻辑 :

  1. 开辟一个栈空间,依次遍历字符串 s 。

  2. 如果是左括号,压入栈中。

  3. 如果是右括号,弹出栈顶元素与其进行比较,若能匹配成功(相同类型),继续遍历,直到全部匹配结束。

  4. 字符串遍历完成后,若栈中仍有元素(非空),则不是有效的括号。


注意:

  • 为了在弹出栈后方便比较,在遇到左括号压栈时,实际上压入的是右括号。
  • 匹配失败的三种情况:


代码

public static boolean isVaild(String s) {
    if (s == null || s.length() == 0) {
        return true;
    }
    char[] str = s.toCharArray();
    // 开辟栈,用来存储括号
    Stack<Character> stack = new Stack<>();
    // 遍历 s 字符串
    for (int i = 0; i < str.length; i++) {
        char cha = str[i];
        // 遇到左括号,压栈
        if (cha == '(' || cha == '[' || cha == '{') {
            // 这里为了接下来 与 '右括号' 比较起来更方便
            // 选择压入对应的 '右括号'
            stack.add(cha == '(' ? ')' : (cha == '[' ? ']' : '}'));
        } else {
            // 大前提:
            // 1. 字符串没有结束
            // 2. 当前字符 cha 是右括号
            //
            // 如果此时栈已经空了,
            // 说明找不到与此时 cha 所对应的左括号了(右括号多)
            // 例如: ())))
            // 情况 1
            if (stack.isEmpty()) {
                return false;
            }
            // 栈不空,弹出栈顶元素
            char last = stack.pop();
            // 由于之前压栈的是左括号对应的右括号
            // 因此若二者字符相同,则表示能匹配成功
            // 情况 2
            if (cha != last) {
                return false;
            }
        }
    }
    // 字符串结束,栈中不能剩余多余的左括号
    // 反例: (((()) ,结束后栈不为空(左括号多),不是有效的括号
    // 情况 3
    return stack.isEmpty();
}

最后

上次给大家介绍的 面试八股文小程序 评价 杠杠滴~~

最近又和朋友一起合作开发了算法全套刷题 ,专门针对于 解决面试中算法问题 学习的课程,有需要的小伙伴可以去看看,保证你在面试中如鱼得水。

~ 点赞 ~ 关注 ~ 星标 ~ 不迷路 ~!!!
回复「1024」获取 Java 面试资源 ~
回复「ACM紫书」获取 ACM 算法书籍 ~
回复「算法导论」获取 算法导论第3版 ~

在看 + 转发

让你的小伙伴们一起来学算法吧!!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

强连通子图

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

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

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

打赏作者

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

抵扣说明:

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

余额充值