20. 有效的括号

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

有效字符串需满足:

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

示例 1:

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

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

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

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

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

解题思路

绕了一大圈弯路,也是做过的题,只记得可以用栈来做,但是想到了用其他方法:字符数组的每一位在这一位后面的+1,+3,+5位置处,如果没有找到一个括号和它匹配,则匹配失败。。。这个方法不好解决如果遇到多个右括号。

退而求其次用,又忘了用栈怎么做。。

网上查了一下思路:
思路很简单,实现也不难,就是将字符串的左括号字符入栈,然后比较下一个括号是否和栈顶元素能匹配,如果能匹配,就出栈,如果也是左括号但不能匹配,则再入栈,再次比较下一个字符...,如果遇到右括号不能和栈顶元素匹配,则返回false

代码

class Solution {
   
    public boolean isValid(String s) {
   
       char[] chars = s.toCharArray();
        Stack<Character> stack = new Stack<>();
        Map<Character,Character> maps = new HashMap<>();
        maps.put('(', ')');
        maps.put('[', ']');
        maps.put('{', '}');
		//将特殊情况排除掉
        if(s.equals("")){
   
            return true;
        }
        //将特殊情况排除掉
        if(chars[0] == '}' || chars[0] == ')' ||chars[0] == ']' ||
                chars[chars.length-1] == '(' || chars[chars.length-1] == '{' ||chars[chars.length-1] == '['){
   
            return false;
        }

        for (int i = 0; i < chars.length; i++) {
   
        //左括号都入栈
            if(chars[i] == '(' || chars[i] == '[' ||chars[i] == '{'){
   
                stack.push(chars[i]);
                continue;
            }
            //栈不为空并且栈顶元素 = 数组元素
            if(!stack.isEmpty() && maps.get(stack.peek()) == chars[i]){
   		//出栈
                stack.pop();
            }else{
   
                return false;
            }

        }
        //栈空则全部匹配
        if(stack.isEmpty()){
   
            return true;
        }else{
   
            return false;
        }

    }
}

测试