刷刷刷 Day 11 | 20. 有效的括号
20. 有效的括号
LeetCode题目要求
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
示例
输入:s = "()[]{}" 输出:true
解题思路
本题是使用栈来解决的经典题目,试想我们要想使对应的左右括号匹配,通过栈方式,可以遍历字符串的时候,将字符逐个放入
以字符串 ()[]{} 为例,遍历字符串,经历一下步骤
1、第一次遍历,取字符 ( ,此时栈为空,入栈
2、第二次遍历,取字符 ) ,此时栈不为空,取栈顶元素 ( , 进行匹配,发现 () 匹配,将栈顶元素出栈,此时栈为空
3、第三次遍历,取字符 [ ,此时栈为空,入栈
4、第四次遍历,取字符 ] ,此时栈不为空,取栈顶元素 [ , 进行匹配,发现 [] 匹配,将栈顶元素出栈,此时栈为空
5、第五次遍历,取字符 { ,此时栈为空,入栈
6、第六次遍历,取字符 } ,此时栈不为空,取栈顶元素 { , 进行匹配,发现 {} 匹配,将栈顶元素出栈,此时栈为空
经过以上 6 步骤,遍历完字符串,栈中也为空,就完成了匹配。其实,上面 34 步骤、与56步骤与 12 一样
关键的步骤就是:
如果栈为空就入栈,不为空就匹配,不匹配的就入栈;
上代码
class Solution { public boolean isValid(String s) { Deque<Character> stack = new ArrayDeque<>(); // 先遍历字符串,如果有匹配的就出栈 for (int i = 0; i < s.length(); i++) { // 如果栈为空,就入栈一个, 不为空的就匹配, 不匹配的就入栈 if (stack.isEmpty()) { stack.push(s.charAt(i)); } else { char stackChar = stack.peek(); if (stackChar == '(' && s.charAt(i) == ')' || stackChar == '[' && s.charAt(i) == ']' || stackChar == '{' && s.charAt(i) == '}') { stack.pop(); } else { stack.push(s.charAt(i)); } } } return stack.isEmpty(); } }
附:学习资料链接
分类:
算法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了