目录
题目链接:LeetCode20.有效的括号
一.题目要求
二.解题思路
三.具体代码
四.运行截图
有效的括号
一.题目要求
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
提示:
1 <= s.length <=s 仅由括号 '()[]{}' 组成
二.解题思路
首先,我们看到这种匹配问题,就可以联想到利用栈的结构特性——先进后出,当遇到左括号时入栈,遇到右括号时出栈比较,不就能轻松实现括号匹配了。
那具体应该如何操作呢?
第1步,我们肯定要建立一个空栈,并且把字符串转换为 "可独立操作字符的" 字符数组,然后通过遍历字符数组进行操作。
第2步,遍历字符数组时,我们就要在其中对字符是 "左括号" 还是 "右括号" 进行判断了,如果是左括号,就进行入栈操作(push(e)),如果是右括号,就进行出栈操作(pop())。
Deque<Character> stack=new LinkedList<>(); //定义栈
char[] array=s.toCharArray(); //转换字符数组
for(char c:array){
if(c=='('||c=='['||c=='{'){
//入栈
stack.push(c);
}else{
//出栈
stack.pop();
}
}
第3步,当然光这样是不够的,我们还需要进行括号的匹配操作,并不是任意的左括号都能和任意的右括号相匹配,所以我们在所有左括号入栈后,还要保存这时出栈的左括号,并和此时出现的右括号进行匹配操作。
//走到这步说明一定遇到了右括号
char left=stack.pop(); //保存出栈的左括号
if(!isMatch(left,c)){ //进行括号匹配
return false;
}
将括号匹配的操作独立为一个函数:
private boolean isMatch(char left,char right){
if(left=='('){
return right==')';
}
else if(left=='['){
return right==']';
}
return right=='}';
}
第4步, 我们还要考虑括号 "数量不匹配" 的情况,此时就要考虑应该在什么时候进行判断,如果是左括号少于右括号,那么说明肯定在没有遍历完的时候,栈就空了(栈只存储了左括号),所以可以在出栈前先判断栈是否为空;如果是右括号少于左括号,那肯定在遍历结束的时候,栈不为空(栈中的左括号正好和后面的右括号全部匹配,已全部出栈)。
此时,我们已经完成这道题目,下面来看一下画图示例:
以示例2为例:
三.具体代码
class Solution {
public boolean isValid(String s) {
Deque<Character> stack=new LinkedList<>();
char[] array=s.toCharArray();
for(char c:array){
if(c=='('||c=='['||c=='{'){
stack.push(c);
}else{
if(stack.isEmpty()){
return false;
}
char left=stack.pop();
if(!isMatch(left,c)){
return false;
}
}
}
if(stack.isEmpty()){
return true;
}else{
return false;
}
}
private boolean isMatch(char left,char right){
if(left=='('){
return right==')';
}
else if(left=='['){
return right==']';
}
return right=='}';
}
}