(leetcode)力扣100 69有效的括号(栈)

题目

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

有效字符串需满足:

左括号必须用相同类型的右括号闭合。

左括号必须以正确的顺序闭合。

每个右括号都有一个对应的相同类型的左括号。

数据范围

1 <= s.length <= 104

s 仅由括号 '()[]{}' 组成

测试用例

示例1

java 复制代码
输入:s = "()"

输出:true

示例2

java 复制代码
输入:s = "()[]{}"

输出:true

示例3

java 复制代码
输入:s = "(]"

输出:false

示例4

java 复制代码
输入:s = "([])"

输出:true

示例5

java 复制代码
输入:s = "([)]"

输出:false

题解(时间On,空间O(n+|Σ|))

java 复制代码
import java.util.*;

class Solution {
    // 移除类级别的成员变量 res,因为函数内部已经有完备的逻辑返回结果
    public boolean isValid(String s) {
        int n = s.length();
        
        // 1. 剪枝优化:如果长度是奇数,肯定无法两两成对,直接返回 false
        if (n % 2 == 1) {
            return false;
        } 

        // 2. 建立映射表:Key 为右括号,Value 为对应的左括号
        // 这样在遍历到右括号时,可以快速找到它"期望"匹配的左括号
        Map<Character, Character> map = new HashMap<>();
        map.put(')', '(');
        map.put(']', '[');
        map.put('}', '{');

        // 3. 使用 Deque 作为栈使用(Java 官方推荐替代 Stack 类)
        // 栈的特性:后入先出,非常适合处理嵌套结构
        Deque<Character> stack = new LinkedList<>();

        for (int i = 0; i < n; i++) {
            char temp = s.charAt(i);
            
            // 4. 如果当前字符是右括号
            if (map.containsKey(temp)) {
                // 情况 A:栈为空,说明右括号多出来了,没有左括号可以匹配
                // 情况 B:栈顶元素不是对应的左括号,说明括号顺序错误(如 "(]")
                if (stack.isEmpty() || stack.peek() != map.get(temp)) {
                    return false;
                } else {
                    // 匹配成功,将栈顶的左括号弹出
                    stack.pop();
                }
            } else {
                // 5. 如果当前字符是左括号,直接压入栈中等待匹配
                stack.push(temp);
            }
        }
        
        // 6. 最后检查栈是否为空
        // 如果为空,说明所有左括号都找到了匹配的右括号;否则说明左括号多了
        return stack.isEmpty();
    }
}

思路

这道题总体来说我觉得可以将难度提到普通,主要确实很考验对栈使用的基本功,整体代码也有很多细节,对如何判false这设计也其实非常巧妙。整体逻辑我就不重复了,看代码备注就行了,总体来说这道题很不错,能加深我们如何对栈的使用

相关推荐
Hcoco_me1 小时前
图像分割:目标检测、语义分割和实例分割
人工智能·深度学习·算法·目标检测·计算机视觉·目标跟踪
We་ct1 小时前
LeetCode 21. 合并两个有序链表:两种经典解法详解
前端·算法·leetcode·链表·typescript
Epiphany.5562 小时前
蓝桥杯2024年第十五届决赛真题-套手镯
c++·算法·蓝桥杯
Σίσυφος19002 小时前
E = Kᵀ F K 的数学原理
算法
小O的算法实验室2 小时前
2025年JIM SCI2区,基于Q学习多目标粒子群算法+节能型分布式流水车间调度,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
YunchengLi2 小时前
【计算机图形学中的四元数】1/2 Quaternions for Computer Graphics
人工智能·算法·机器学习
重生之后端学习2 小时前
108. 将有序数组转换为二叉搜索树
数据结构·算法·深度优先
诸葛务农2 小时前
点云配准在人形机器人中的应用:ICP算法(1)
算法·机器学习·机器人
寻寻觅觅☆10 小时前
东华OJ-基础题-106-大整数相加(C++)
开发语言·c++·算法