20. 有效的括号 + 栈 + 括号匹配

20. 有效的括号

LeetCode_20

题目描述

相似题目

题号 题目 备注
20 有效的括号
22 括号生成 dfs
5 最长回文子串 dp
647 回文子串 dp
32 最长有效括号 dp
678 有效的括号字符串 栈、dp

方法一:使用常规思路-使用栈匹配括号

class Solution {
    public boolean isValid(String s) {
        int len = s.length();
        if((len & 1) == 1)
            return false;
        Stack<Character> sta = new Stack<>();
        Map<Character, Character> map = new HashMap<>();
        map.put('(', ')');
        map.put('{', '}');
        map.put('[', ']');
        for(int i=0; i<len; i++){
            char ch = s.charAt(i);
            if(sta.isEmpty())
                sta.push(ch);
            else{
                if(ch == map.getOrDefault(sta.peek(), '#')){//注意这里不能直接使用map.get方法,因为我们的map只存储了三种情况,实际上可能会出现6种字符
                    sta.pop();
                }else sta.push(ch);
            }
        }
        return sta.isEmpty();
    }
}

方法二:更高效解法

  1. 本题可以扩展一下思维,map中存储反括号和正括号对,因为一旦出现了反括号,栈顶的元素一定要是正括号,否则匹配必定失败。
  2. 要注意初始栈为空的情况。
class Solution {
    public boolean isValid(String s) {
        int len = s.length();
        if((len & 1) == 1)
            return false;
        Stack<Character> sta = new Stack<>();
        Map<Character, Character> map = new HashMap<>();
        map.put(')', '(');
        map.put('}', '{');
        map.put(']', '[');
        for(int i=0; i<len; i++){
            char ch = s.charAt(i);
            if(map.containsKey(ch)){
                if(sta.isEmpty() || sta.peek() != map.get(ch))
                    return false;
                sta.pop();
            }else{
                sta.push(ch);
            }
        }
        return sta.isEmpty();
    }
}
posted @   Garrett_Wale  阅读(81)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
历史上的今天:
2020-03-13 蓝桥杯-分考场(dfs)
2020-03-13 蓝桥杯-合根植物(并查集)
2020-03-13 蓝桥杯-小计算器(进制转换和模拟)
点击右上角即可分享
微信分享提示