力扣热题100 20. 有效的括号

给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。

  • 示例 1:
  • 输入:s = "()"
  • 输出:true
  • 示例 2:
  • 输入:s = "()[]{}"
  • 输出:true
  • 示例 3:
  • 输入:s = "(]"
  • 输出:false
  • 示例 4:
  • 输入:s = "([])"
  • 输出:true

示例 5:

  • 输入:s = "([)]"
  • 输出:false

这个题目其实是一个阅读理解题,
示例 5:
输入:s = "([)]"
输出:false
这个 示例懂了就行了。

简言之:只要遇见右括号,然后和栈中栈顶数据比较,是一对就返回,不是则不对。即:当前右括号对应的左边 必须在栈顶

bash 复制代码
  public boolean isValid(String s) {
        // 余1 一定是奇数,不成对,返回false
        if (s.length() % 2 == 1) {
            return false;
        }
        Map<Character, Character> pairs = new HashMap<Character, Character>();
        pairs.put(')', '(');
        pairs.put(']', '[');
        pairs.put('}', '{');
        Deque<Character> stack = new ArrayDeque<>();
        for (int i = 0; i < s.length(); i++) {
            char cur = s.charAt(i);
            // 如果是左括号,则不包含在pairs 的key 中,入栈。
            // 如果是右括号,则包含在pairs 的key 中,判断栈是否为空,为空返回false,否则出栈,判断栈顶元素和当前字符是否匹配,不匹配返回false,匹配则继续循环。
            if (pairs.containsKey(cur)) {
                if (!stack.isEmpty()) {
                    // 如果栈顶元素门和当前字符锁对应的门匹配,则出栈,否则返回false
                    final Character pop = stack.pop();
                    if (pop != pairs.get(cur)) {
                        return false;
                    }
                } else {
                    return false;
                }
            } else {
                stack.push(cur);
            }
        }
        return stack.isEmpty();
    }



为什么字典(Map)里要写成 ')' → '(',而不是 '(' → ')'?
🌟 举个例子:"([)]"

看到 ( → 开圆门 → 记在心里(入栈)

看到 [ → 开方门 → 记在心里(入栈)

👉 现在心里记得:先开了圆门,再开了方门(方门是最新的!)

看到 ) → 要关圆门了!

👉 小明立刻查记忆本:

"关 ) 门,应该对应哪个开门动作?"

记忆本说:(

👉 但他心里记得最近开的是方门 [

👉 [( → ❌ 配不上!游戏失败!

🔑 关键:只有"关门"的时候才需要查"该配哪个开门动作",所以字典必须以"关门动作"为 key!

❌ 如果反过来写(错误方式)

假如小明的记忆本写成:

开门动作 对应的关门动作
( )
[ ]

那会怎样?

当他看到 ( (开门),他会想:"哦,以后要关 ) " ------ 但这没用!

因为他不知道什么时候关,也不知道关的时候是否匹配。

当他看到 ) (关门),他查不到!因为字典里没有以 ) 为 key 的记录。

👉 他就不知道该配哪个开门动作!

❌ 完全没法判断!

这个题目很容易理解为:只要字符串中存在对应的右括号(不要求顺序、不要求连续闭合),就算有效"

💡 新题其实变成了:检查每种括号的左、右出现次数是否相等。

🛠️ 解法思路(新题)
不需要栈!只需要计数器:
统计 '(' 和 ')' 的数量
统计 '{' 和 '}' 的数量
统计 '[' 和 ']' 的数量
如果每一对的数量都相等,就返回 true。

bash 复制代码
    /**
     *  只要字符串中存在对应的右括号(不要求顺序、不要求连续闭合),就算有效
     */
    public boolean isValid2(String s) {
        if (s.length() % 2 == 1) {
            return false;
        }
        int round = 0;
        int square = 0;
        int curly= 0;

        for (int i = 0; i < s.length(); i++) {
            char cur = s.charAt(i);
            if (cur =='(') round++;
            else if (cur ==')') round--;
            else if (cur =='[') square++;
            else if (cur == ']') square--;
            else if (cur =='{') curly++;
            else if (cur == '}') curly--;
        }

        return round ==0 && square ==0 && curly ==0;
    }
相关推荐
仰泳的熊猫1 小时前
题目2570:蓝桥杯2020年第十一届省赛真题-成绩分析
数据结构·c++·算法·蓝桥杯
无极低码5 小时前
ecGlypher新手安装分步指南(标准化流程)
人工智能·算法·自然语言处理·大模型·rag
软件算法开发5 小时前
基于海象优化算法的LSTM网络模型(WOA-LSTM)的一维时间序列预测matlab仿真
算法·matlab·lstm·一维时间序列预测·woa-lstm·海象优化
superior tigre6 小时前
22 括号生成
算法·深度优先
努力也学不会java7 小时前
【缓存算法】一篇文章带你彻底搞懂面试高频题LRU/LFU
java·数据结构·人工智能·算法·缓存·面试
旖-旎7 小时前
二分查找(x的平方根)(4)
c++·算法·二分查找·力扣·双指针
ECT-OS-JiuHuaShan7 小时前
朱梁万有递归元定理,重构《易经》
算法·重构
智者知已应修善业8 小时前
【51单片机独立按键控制数码管移动反向,2片74CH573/74CH273段和位,按键按下保持原状态】2023-3-25
经验分享·笔记·单片机·嵌入式硬件·算法·51单片机
khddvbe8 小时前
C++并发编程中的死锁避免
开发语言·c++·算法