LeetCode:20. 有效的括号

简介

题目链接:https://leetcode.cn/problems/valid-parentheses/description/

解决方式:字符串 + 栈 / 栈、映射

实现思路:

迭代字符,遇到左括号则放入栈中否则根据当前的右括号去栈中匹配。栈顶元素若不是右括号对应的左括号就证明包含无效括号。迭代结束后栈中应无数据,有则证明左括号多了。

java 复制代码
class Solution {
    public boolean isValid(String s) {
        int n = s.length();
        // 转换为字符数组
        char[] ch = s.toCharArray();
        // 栈
        Stack<Character> stack = new Stack<>();
        // 循环
        for(int i = 0; i < n; i++){
            // 左括号加入栈
            if(ch[i] == '(' || ch[i] == '{' || ch[i] == '[') {
                stack.add(ch[i]);
            }else{
                // 右括号匹配
                if(stack.isEmpty()) {
                    return false;
                }
                if(ch[i] == ')' && stack.pop() != '(') {
                    return false;
                }else if(ch[i] == '}' && stack.pop() != '{') {
                    return false;
                }else if(ch[i] == ']' && stack.pop() != '[') {
                    return false;
                }
            }
        }
        // 循环结束栈中应无数据,若有则有无效括号
        return stack.size() > 0 ? false : true;
    }
}

栈、映射

实现思路:

这是另一种写法,将左右括号的匹配加入映射而非直接硬编码。这种写法时间复杂度较高。

java 复制代码
class Solution {
    public boolean isValid(String s) {
        // 边界处理
        if(s == "" || s.length() % 2 != 0){
            return false;
        }
        // 有效括号映射
        Map<Character, Character> pairs = new HashMap<>();
        pairs.put(')', '(');
        pairs.put(']', '[');
        pairs.put('}', '{');
        // 栈
        Deque<Character> stack = new ArrayDeque<>();
        // 循环,遇到左括号入栈,遇到右括号则匹配栈中的左括号
        for(int i = 0; i < s.length(); i++){
            char c = s.charAt(i);
            if(pairs.containsKey(c)){
                // 栈为空 或 栈顶不匹配 -> 无效
                if(stack.isEmpty() || stack.pop() != pairs.get(c)){
                    return false;
                }
            }else{
                // 左括号直接入栈
                stack.push(c);
            }

        }
        // 所有字符处理完后,栈应为空。不为空则有无效括号。
        return stack.isEmpty();
    }
}
相关推荐
半个落月7 小时前
从递归到快速排序:用 JavaScript 把分治思想讲明白
javascript·算法·面试
小月土星7 小时前
JavaScript 快速排序:从 pivot、双指针到分治思想
javascript·算法·面试
小月土星8 小时前
JavaScript 递归入门:从 1 到 n 求和,再到数组扁平化
javascript·算法·面试
To_OC1 天前
LC 1 两数之和:面试第一道必考题,暴力解法直接被面试官 pass
javascript·算法·leetcode
鱼鱼不愚与1 天前
《原来如此 | 第01期:为什么导航软件能预测红绿灯倒计时?》
算法
复杂网络1 天前
论最小 Agent 计算机的形态
算法
kisshyshy2 天前
🍦 雪糕、食堂、火车厢:三幅漫画吃透栈、队列与链表
javascript·算法
猿人谷2 天前
不只是 CPU 阈值:STAR 如何用 GAT + Transformer 做容器级自动扩缩容?
人工智能·算法
复杂网络2 天前
Stable Diffusion 视觉大模型微调技术深度调研
算法