刷刷刷 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();
}
}

附:学习资料链接

posted @   blacksonny  阅读(2)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示