【每日一题】有效的括号

🌟个人博客:www.hellocode.top🌟
⭐所有文章均在上方博客首发,其他平台同步更新
🔥本文专栏:《每日一题》
⚡如有问题,欢迎指正,一起学习~~
文章部分参考《代码随想录》,如有侵权,请联系删除~~


  • 时间:2022-05-22
  • 题目序号:20
  • 难度:简单

问题描述

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

有效字符串需满足:

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

来源:力扣(LeetCode)

示例1

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

示例2

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

示例3

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

示例4

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

示例5

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

提示

  • 1 <= s.length <= 104
  • s 仅由括号 '()[]{}' 组成

解题思路

题解部分参考自代码随想录。如有侵权,请联系进行删除~~

  • 从题目来看,这题使用栈来实现的话,还是比较好理解的
  • 遍历字符串,如果遇到左括号,就把它对应的右括号入栈(方便和右括号进行匹配)
  • 如果遇到右括号,就将栈顶元素弹出,和该右括号对比,判断是否匹配

到这里,大家先不要急着写代码,先来想想不匹配的情况都有哪几种:

  1. 就是当前字符为右括号,与栈顶左括号不匹配,这个比较容易想到
  2. 当匹配完后,栈内还有元素(不为空),如下图,也是不匹配的

图1

  1. 当字符串未匹配完,但栈内已经没有左括号与之匹配了

图2

  • 在写代码时,需要注意将以上三种情况都做出判断

20.有效括号

代码实现

除了上述三种不匹配情况,本着一一对应原则,如果能匹配的上,字符串长度一定是偶数,因此可以先对此进行判断,如果为奇数,则一定不匹配

注意:偶数不一定匹配(如题解中的图2),但是奇数一定不匹配

题目中明确说明了只包含{}[]()括号,所以我们不需要考虑其他的括号

class Solution {
    public boolean isValid(String s) {
        if(s.length() % 2 != 0) return false;
        Deque<Character> deque = new LinkedList<>();
        char ch;
        for(int i = 0; i < s.length(); i++){
            ch = s.charAt(i);
            // 如果是左括号,就把对应的右括号入栈
            if(ch == '(') deque.push(')');
            else if(ch == '{') deque.push('}');
            else if(ch == '[') deque.push(']');
            // 右括号匹配
            else if(deque.isEmpty() || deque.peek() != ch){  // 判断是否是第1、3中不匹配情况
                return false;
            }
            else deque.pop();       // 如果匹配,就弹出栈顶元素
        }
        return deque.isEmpty();     // 判断是否是第二种不匹配情况
    }
}

总结

  • 栈的使用场景还是比价广泛的:浏览器的前进后退、递归的实现、类似括号的匹配算法等等
  • 本题还是比较经典的,但是也有很多容易弄错的地方
    • 如果是左括号,是将对应的右括号入栈,方便后面的匹配判断
    • 在判断是否是第3种不匹配情况时,是使用peek方法而不是pop
      pop方法会将元素移除,peek只是获取结点,不会将其弹出栈
  • 5
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

九思のJava之路

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

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

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

打赏作者

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

抵扣说明:

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

余额充值