0
点赞
收藏
分享

微信扫一扫

LeetCode — 有效的括号(Java实现)

niboac 2022-01-15 阅读 43

题目

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

有效字符串需满足:

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

示例一:

示例二:

示例三:

示例四:

示例五:

题目分析

返回false共有三种情况:左括号多于右括号,右括号多于左括号,左右括号不匹配
左右括号对顺序是有要求的,不能简单地判断括号数量,因此需要用到栈

解题步骤:

  1. 遍历字符串,如果元素为左括号,入栈,如果元素为右括号,则分况讨论
  2. 如果栈为空,则说明左右括号不匹配或右括号多于左括号,return false;
  3. 如果栈不为空但括号不匹配,return false;
  4. 如果栈不为空且左右括号匹配,则继续遍历
  5. 遍历结束后如果栈不为空,则说明左括号多于右括号,return false;
  6. 如果栈为空,说明括号匹配,return true;

代码实现:

class Solution {
    public boolean isValid(String s) {
        //定义一个栈,遍历字符串s,如果查找到左括号,入栈,如果遍历到右括号,查看栈顶元素看是否匹配
        //如果栈为空,说明不匹配,返回false
        //如果栈不为空但括号不匹配,返回false
        //如果匹配,继续遍历
        //遍历结束后,如果栈不为空,说明左括号多,返回false
        //如果仍未返回,则说明括号匹配,返回true
        Stack<Character> stack = new Stack<>();![请添加图片描述](https://img-blog.csdnimg.cn/c6f4824ef5d84db7a60c2b43fa8c8f42.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5LuK5aSp5LiK5LygZ2l05LqG5ZCX,size_20,color_FFFFFF,t_70,g_se,x_16)

        for(int i=0;i<s.length();++i){
            char c = s.charAt(i);
            if(c=='(' || c=='[' || c=='{'){ //遍历时遇到左括号,入栈
                stack.push(c);
            }else{  //遍历遇到右括号,判断
                if(stack.empty()){    //栈为空
                    return false;
                }
                char top = stack.peek();
                //左右括号匹配,则将栈顶元素弹出,继续遍历
                if(top=='('&& c==')' || top=='{'&& c=='}' || top=='['&& c==']' ){
                  stack.pop();
                }else{		//左右括号不匹配
                    return false;
                }
            }
        }
        if(!stack.empty()){		//遍历结束后栈不为空,证明左括号多于右括号
            return false;
        }
        return true;
    }
}

运行通过
请添加图片描述

举报

相关推荐

0 条评论