[leetcode篇]20.有效的括号

好长时间都不更新leetcode题解了,博主今天忙里偷闲来解一下这个有关于栈知识的题目。
20.有效的括号:OJ链接
先看题目描述:

给定一个只包括 ‘(’,’)’’{’,’}’’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。

示例 1: 输入:s = “()” 输出:true
示例 2:输入:s = “()[]{}” 输出:true
示例 3: 输入:s = “(]” 输出:false
示例 4:输入:s = “([)]” 输出:false
示例 5: 输入:s = “{[]}” 输出:true

解题想法:

  1. 第一步老样子判断传来的字符串是否为空,如果为空就返回null,判断传来的字符串是否为0,在题目中明确表明当字符串长度为0时,返回true;
  2. 第二步:这下就到重点了,有效括号,括号有左括号和右括号,并且要想办法看他们是否匹配。这里有一种方法利用栈的特性先进后出我们从字符串的左边遍历,把左括号压到栈中,然后在遍历下一个字符,如果下一个字符是右括号,那么就看看栈中的括号和我们遍历到的这个字符是否匹配(注意括号类型),如果匹配就把栈中的字符弹出,然后在遍历下一个字符串,重复循环,直到把字符串遍历完成。
  3. 我们在遍历字符串的过程中,可能会遇到左括号多,右括号少的情况,比如说(((()),那就是在两次匹配之后,我们把栈中的两个左括号都弹出,现在还有两个左括号,就直接判断栈是否为空,如果为不为空就返回false.
  4. 在我们遍左括号的过程中还会遇到,左括号少,右括号多的情况。 比如(())))还是一样的在我们两次匹配之后,右括号还剩余一个,所以我们现在要检查栈中是否还有左括号,如果没有就返回false.

案例一:当字符串为"{[()]}"
动图演示:
在这里插入图片描述
案例二:当字符串为"(){}[]"
动图演示:
在这里插入图片描述
案例三:当字符串为"(())))"
动图演示:
在这里插入图片描述

案例四:"(((())"
动图演示:
在这里插入图片描述
代码演示:

    public  static  boolean isValid(String s) {
        //先看传来的字符串是不是为空
        if(s.length() == 0){
            return true;
        }
        if(s == null){
            return false;
        }
        //创建一个栈,用来保存字符串中的左括号
        Stack<Character>stack = new Stack<>();
         for(int i = 0;i<s.length();i++){
             char ch = s.charAt(i);//获取每一个字符
             if(ch == '{' || ch == '[' || ch == '('){
                 stack.push(ch);
             }else if(stack.empty()){//右括号多
                 return false;
             } else{
                  char temp = stack.peek();
                  if(temp == '{' && ch == '}' || temp == '[' && ch == ']' || temp == '(' && ch == ')'){
                      stack.pop(); //如果匹配上了,那么就把这个原来在栈上的左括号弹出,查看下一个左括号和右括号是否匹配
                 }else{
                      return false;//左括号和右括号不匹配
                  }
             }
             //如果在匹配完之后,有右括号剩余
         }
         if(!stack.empty()){ //如果在匹配完之后栈中还没有为空,那么证明左括号多了
             return false;
         }
         return true;
    }
  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

小周学编程~~~

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

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

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

打赏作者

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

抵扣说明:

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

余额充值