欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

leetcode-20.有效的括号

程序员文章站 2022-04-25 20:21:29
...

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

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。

示例 1:

输入: “()”
输出: true
示例 2:

输入: “()[]{}”
输出: true
示例 3:

输入: “(]”
输出: false
示例 4:

输入: “([)]”
输出: false
示例 5:

输入: “{[]}”
输出: true

来源:力扣(LeetCode)
链接:20.有效的括号
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

分析
由题意需要从左往右扫描左括号,然后再从右往左去寻找与前面找到的左括号一一对应的右括号,因此很容易想到借这一结构来辅助分析。
由于栈是先进后出,后面的元素始终在栈顶,因此,可以从左往右依次扫描字符串,若是左括号便入栈,然后判断下一括号是否是与之匹配的右括号,若是则弹出栈顶括号,否则将这下一括号进行入栈操作。
最后需要判断栈是否为空,因为若是括号是一一对应的,那么栈为空,否则栈里面还剩下未匹配的左右括号。

代码

public static boolean isValid(String s) {

        //输入为空
        if(s==null || s.length()==0){
            return true;
        }

        //奇数个括号肯定不满足
        if(s.length()%2!=0){
            return false;
        }

        //利用栈来保存括号
        Stack<Character> stack = new Stack<Character>();

        for (int i = 0; i <s.length() ; i++) {
            //左括号才入栈
            if(s.charAt(i)=='(' || s.charAt(i)=='[' || s.charAt(i)=='{'){
                stack.push(s.charAt(i));
            }else {
                //若栈为空 说明第一个为右括号 不行
                if(stack.size()==0){
                    return false;
                }else {
                    if(stack.peek()=='('){
                        if(s.charAt(i)!=')'){
                            return false;
                        }else {
                            stack.pop();
                        }
                    }else if(stack.peek()=='['){
                        if(s.charAt(i)!=']'){
                            return false;
                        }else {
                            stack.pop();
                        }
                    }else if(stack.peek()=='{'){
                        if(s.charAt(i)!='}'){
                            return false;
                        }else {
                            stack.pop();
                        }
                    }else {
                        return false;
                    }
                }
            }

        }

        //由于要一一匹配,故最终栈为空
        return stack.empty();
    }

leetcode-20.有效的括号
2020.03.10