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

相关推荐
csdn_aspnet18 小时前
C/C++ 两个凸多边形之间的切线(Tangents between two Convex Polygons)
c语言·c++·算法
数据皮皮侠18 小时前
中国城市间地理距离矩阵(2024)
大数据·数据库·人工智能·算法·制造
3GPP仿真实验室18 小时前
深度解析基站接收机核心算法:从 MRC 到 IRC 的空间滤波演进
算法
Boop_wu18 小时前
[Java 算法] 动态规划(1)
算法·动态规划
WolfGang00732118 小时前
代码随想录算法训练营 Day18 | 二叉树 part08
算法
hanlin0319 小时前
刷题笔记:力扣第43、67题(字符串计算)
笔记·算法·leetcode
yang_B62119 小时前
最小二乘法 拟合平面
算法·平面·最小二乘法
放下华子我只抽RuiKe519 小时前
深度学习全景指南:硬核实战版
人工智能·深度学习·神经网络·算法·机器学习·自然语言处理·数据挖掘
吴秋霖20 小时前
【某音电商】protobuf聊天协议逆向
python·算法·protobuf
studyForMokey20 小时前
【Android面试】Activity生命周期专题
android·面试·职场和发展