首页 > 其他分享 >力扣---20. 有效的括号

力扣---20. 有效的括号

时间:2023-02-20 12:34:50浏览次数:36  
标签:--- 20 map else 力扣 括号 return false stack

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

示例 1:
输入:s = "()"
输出:true

示例 2:
输入:s = "()[]{}"
输出:true

示例 3:
输入:s = "(]"
输出:false

提示:
    1 <= s.length <= 104
    s 仅由括号 '()[]{}' 组成
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/valid-parentheses
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


 

class Solution {
    public boolean isValid(String s) {
        // 如果s的长度是奇数,直接返回FALSE即可。
        // 这里是用位运算来判断奇偶。当(s.length()&1) != 1时,是偶数。
        if (!((s.length()&1) != 1)) {
            return false;
        }
        Stack<Character> stack = new Stack<>();
        for (char a : s.toCharArray()) {
            if (a == '(' || a == '[' || a == '{') {
                stack.push(a);
            } else {
                // 如果栈为空,则直接返回FALSE。否则出栈会报错。
                if (stack.empty()) {
                    return false;
                } else {
                    char b = stack.pop();
                    // 这部分判断可以用一个map来代替。
                    if (a == ')') {
                        if (b != '(') {
                            return false;
                        }
                    } else if (a == ']') {
                        if (b != '[') {
                            return false;
                        }
                    } else if (a == '}') {
                        if (b != '{') {
                            return false;
                        }
                    }
                }
            }
        }
        // 如果运行结束后栈为空,返回true,否则意味着左括号数量比右括号数量多,不匹配。
        return stack.empty();
    }
}

 

 

 用map优化后的代码:

由于数据量较小,所以用的速度反倒没有直接判断快。

class Solution {
    public boolean isValid(String s) {
        // 如果s的长度是奇数,直接返回FALSE即可。
        // 这里是用位运算来判断奇偶。当(s.length()&1) != 1时,是偶数。
        if (!((s.length()&1) != 1)) {
            return false;
        }
        // 内部类添加数据。
        Map<Character, Character> map = new HashMap<>() {{
            put('(', ')');
            put('[', ']');
            put('{', '}');
        }};
        Stack<Character> stack = new Stack<>();
        for (char a : s.toCharArray()) {
            if (map.containsKey(a)) {
                stack.push(a);
            } else {
                // 如果栈为空,则直接返回FALSE。否则出栈会报错。
                if (stack.empty()) {
                    return false;
                } else if (map.get(stack.pop()) != a) {
                    return false;
                }
            }
        }
        // 如果运行结束后栈为空,返回true,否则意味着左括号数量比右括号数量多,不匹配。
        return stack.empty();
    }
}

标签:---,20,map,else,力扣,括号,return,false,stack
From: https://www.cnblogs.com/allWu/p/17136906.html

相关文章