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

相关推荐
jidaowansui21 分钟前
B3643 图的存储———>数组模拟邻接矩阵
算法
y1su32 分钟前
Leetcode 二分模板
java·数据结构·算法·leetcode·排序算法
youshi666839 分钟前
平衡车——PID算法优化
stm32·单片机·嵌入式硬件·算法·pid·平衡车
聪明蛋子哟2 小时前
不仅仅是向量检索:结合知识图谱与Tool Calling的混合增强生成(Hybrid RAG)方案
人工智能·算法·知识图谱
Pniubi2 小时前
力扣55跳跃游戏(贪心)
算法·leetcode·游戏
jyyyx的算法博客2 小时前
传球游戏【思维】
算法
FL16238631292 小时前
关于2026年南昌大学811信号与系统最后一题电路系统解题思路
算法
殷色玫瑰2 小时前
C++ STL:map 与 set 详解——从底层红黑树到实际应用
c语言·数据结构·c++·算法·visualstudio·rpc
行者全栈架构师2 小时前
【鸿蒙心迹】鸿蒙网络请求架构实战——@ohos.net.http 到 Axios 封装、拦截器与统一错误处理(HarmonyOS 7.x)
前端·算法·架构
小宋10213 小时前
OpenTelemetry GenAI可观测性实战:串起模型、工具、Token与错误
java·人工智能·算法·贪心算法