leetcode 20. 有效的括号

题目描述:

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

思路:

通过栈解决。匹配到对称的括号,就出栈。
有左括号就入栈,遍历到对应的右括号就将其左括号出栈。
如果是有效括号,最后栈为空。

代码:

比较简单的写法:

   public boolean isValid(String s) {
        if (s==null) {
            return false;
        }
        int n = s.length();
        //括号是对称的。如果是奇数个,说明不符合
        if (n%2 == 1) {
            return false;
        }
        //通过 map 匹配。map的初始化,需要注意。key 为右括号。并且是字符,只需要单引号
        //字符的泛型是 Character ,不要写错了
        Map<Character, Character> map = new HashMap<>();
        map.put(')','(');
        map.put('}','{');
        map.put(']','[');

        Stack<Character> stack = new Stack<>();
        for (int i=0;i< n; i++) {
            char c = s.charAt(i);
            //如果包含了右括号, 并且栈不为空,取出的数据等于对应的左括号,说明是一对匹配的括号,就 pop() 取出来
            if (map.containsKey(c) && !stack.isEmpty() && stack.peek() == map.get(c)) {
                stack.pop();
            } else {
                //否则 push进stack
                stack.push(c);
            }
        }
        //如果是对称括号,最后栈应该是空的.
        return stack.isEmpty() ;
      
    }

其他的写法:

    public boolean isValid(String s) {
        int n = s.length();
        //括号是对称的。如果是奇数个,说明不符合
        if (n%2 == 1) {
            return false;
        }
        //通过 map 匹配。map的初始化,需要注意。key 为右括号。并且是字符,只需要单引号
        //字符的泛型是 Character ,不要写错了
        Map<Character,Character> map = new HashMap<>() {{
            put( ')', '(');
            put( ']', '[');
            put( '}', '{');
        }}
        //栈,通过链表实现
        //Deque(Double Ended Queue)是一个双端队列,它可以在两端插入和删除元素,并且可以充当栈或队列的角色。
        Deque<Character> stack = new LinkedList<>();
        for (int i=0; i<n; i++) {
            char ch = s.charAt (i);
            //如果包含了右括号
            if (map.containsKey(ch)) {
                //如果栈为空,或者取出的数据不为左括号,说明不是有效的括号
                if (stack.isEmpty() || stack.peek()!= map.get(ch)) {
                    return false;
                }
                //一旦有对称括号,马上就取出
                stack.pop();
            } else {
                //不是右括号就入栈
                stack.push(ch);
            }
        }
        //如果是对称括号,最后栈应该是空的.
        return stack.isEmpty();
    }
    

posted on 2024-11-03 16:32  乐之者v  阅读(22)  评论(0)    收藏  举报

导航