刷刷刷 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();
}
}
附:学习资料链接