(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这设计也其实非常巧妙。整体逻辑我就不重复了,看代码备注就行了,总体来说这道题很不错,能加深我们如何对栈的使用

相关推荐
徐小夕8 小时前
pxcharts Ultra V2.3更新:多维表一键导出 PDF,渲染兼容性拉满!
vue.js·算法·github
CoovallyAIHub9 小时前
OpenClaw一脚踩碎传统CV?机器终于不再只是看世界
深度学习·算法·计算机视觉
CoovallyAIHub9 小时前
仅凭单目相机实现3D锥桶定位?UNet-RKNet破解自动驾驶锥桶检测难题
深度学习·算法·计算机视觉
zone77399 小时前
002:RAG 入门-LangChain 读取文本
后端·算法·面试
得物技术10 小时前
得物社区搜推公式融合调参框架-加乘树3.0实战
算法
会员源码网1 天前
使用`mysql_*`废弃函数(PHP7+完全移除,导致代码无法运行)
后端·算法
木心月转码ing1 天前
Hot100-Day10-T438T438找到字符串中所有字母异位词
算法
HelloReader1 天前
Wi-Fi CSI 感知技术用无线信号“看见“室内的人
算法
颜酱1 天前
二叉树分解问题思路解题模式
javascript·后端·算法
qianpeng8971 天前
水声匹配场定位原理及实验
算法