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

相关推荐
Sagittarius_A*1 小时前
后量子密码|通识认知 03|量子威胁辟谣:Grover 算法对对称密码的影响与误区
算法·信息安全·密码学·量子计算·pqc·后量子密码
测试者家园1 小时前
AI如何发现测试人员看不到的问题?
人工智能·职场和发展·agent·智能化测试·幻觉检测·行为漂移
QAQo7T2 小时前
Python组蓝桥杯备赛超详细知识点总结笔记_排序算法篇
笔记·python·算法·蓝桥杯·排序算法
普通网友3 小时前
蓝桥杯 DP 优化:从 O (n²) 到 O (n) 的滚动数组实战
职场和发展·蓝桥杯
醉颜凉3 小时前
蓝桥杯2025年第十六届省赛真题-好串的数目
职场和发展·蓝桥杯
醉颜凉3 小时前
蓝桥杯2025年第十六届省赛真题-最大数字 Python题解
python·职场和发展·蓝桥杯
千里之行,始于足下sanhai3 小时前
P8686 [蓝桥杯 2019 省 A] 修改数组 - 数字魔法大冒险 题解
c++·算法·动态规划
2301_806204463 小时前
蓝桥杯第十四届省赛代码参考
职场和发展·蓝桥杯
Ronin-Lotus3 小时前
蓝桥杯篇---EEPROM内部存储地址
职场和发展·蓝桥杯·c·eeprom·keil
小星星闪亮登场3 小时前
Codeforces Round 1115 ( Div. 2)
数据结构·c++·算法·贪心算法·排序算法·codeforces