OJ题解:有效的括号

题目

题目链接

题目链接

题目描述

题目解析

该题可以利用栈这个数据结构来解决,因为最后一个左括号是要和第一个右括号匹配的,倒数第二个左括号是要和第二个右括号匹配的,以此类推...可以看出左括号有后进先出,先进后出的特点,符合栈的特点。

可以用一个for循环从左到右获取字符串的每一个字符,每获取一个字符,就检查是左括号还是右括号,如果是左括号就入栈,如果是右括号,就检查他和左括号匹不匹配。因此,有两种情况可以直接判定为无效的括号。

第一种就是已经检测到右括号了,但是还没检测到左括号,即没有左括号入栈;或者是左括号已经被右括号匹配完了,但是还有右括号,这两种栈为空的情况,就可以直接判定为无效的括号,返回false。比如:)()(),检测到第一个右括号)了,但是前面还没有左括号。还有(())))左括号已经被匹配完了,依旧剩有右括号,也可以直接判定为无效的括号,返回false。

第二种情况就是右括号和左括号不匹配,也可以直接判定为无效的括号,返回false。比如:{[{)]},第一个右括号为)和倒数第一个左括号{不匹配。

再来说说匹配的情况,右括号要匹配左括号时,因为目前你还不知道匹不匹配,不能直接pop,要先peek一下,peek后匹配的话,才能pop。

最后右括号都匹配完左括号了,还得检查一边左括号有没有全被匹配完,如果没有的话就是无效的括号。比如:(({[{[()]}{}()[],当所有右括号都匹配完左括号,还剩下四个左括号(({[,这种情况就是无效的括号。

Java代码实现

java 复制代码
class Solution {
    public boolean isValid(String s) {
        Stack<Character> stack = new Stack<>();
        for(int i = 0 ; i < s.length(); i++) {
            char ch = s.charAt(i);
            //检测到左括号入栈
            if(ch == '(' || ch == '{' || ch == '[') {
                stack.push(ch);
            } else { //检测到右括号
                if(stack.empty()) { //如果没有左括号,或左括号已经被匹配完,返回false
                    return false;
                } 
                char top = stack.peek();
                //现在top是左括号,ch是右括号 
                if((top == '(' && ch == ')') || (top == '{' && ch == '}') || (top == '[' && ch == ']')) {
                    stack.pop();
                } else {
                    return false;
                }
            }
        }
        if(!stack.empty()) { //最后所有右括号都匹配上了左括号,还得检查一下左括号有没有被匹配完
            return false;
        } 
        return true;
    }
}
相关推荐
SL_staff26 分钟前
私有化低代码:面向强监管行业的可控数字化实践
java·低代码
三翼鸟数字化技术团队1 小时前
高性能存储引擎RocksDB:原理与Java生态实践
java
SL_staff1 小时前
JVS-APS有限产能建模的七个刚性支点:面向产线真实约束的技术实现解析
java·开源·全栈
特立独行的猫A1 小时前
少 3 个环节、少 1 次 ABI、少 3500 行代码:cj-tauri 与 Ionic/Capacitor 的鸿蒙桥接机制对比
java·后端·python
学长毕设2 小时前
基于SpringBoot的高校后勤报修管理系统-附源码
java·spring boot·后端
特立独行的猫A2 小时前
cj-tauri vs Rust/Tauri 同款播放器实测:编译 21 秒 vs 11 分钟,磁盘 12 MB vs 1.2 GB
java·后端·python
杨凯凡2 小时前
Spring AI RAG 实战:向量检索、租户过滤、引用溯源与防幻觉边界
java·人工智能·spring
小科先生3 小时前
Java springboot调用数据库的基本流程
java·数据库·spring boot
秋饼4 小时前
GPT-Live 全双工语音 API Java 服务端落地实战:事件协议、会话恢复与生产踩坑
java·ai·技术分享·后端开发
SL_staff4 小时前
为什么企业级自动化不能只靠AI编排?——逻辑引擎在确定性业务场景中的不可替代性
java·开源·产品