题目:
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
1、左括号必须用相同类型的右括号闭合。
2、左括号必须以正确的顺序闭合。
3、每个右括号都有一个对应的相同类型的左括号。
思路:
使用栈,当元素为左括号时,入栈,当遇到右括号,就和栈顶元素匹配
比如:)要求栈顶元素一定要是(
匹配不成功的可能:
2.栈为空,栈中没有元素,多了右括号 -------- return false
1.栈顶元素不是( ------- return false
3.所有右括号都匹配完了,栈中还有左括号 -------return false
代码如下:
class Solution {
//栈:其中放的元素是左括号,当遇到右括号时,尝试与栈顶元素匹配
public boolean isValid(String s) {
//定义一个栈,里面存放的是Character类型
Deque<Character> stack=new LinkedList<>();
//进行字符串中每一个字符的匹配 遍历
char[] arr=s.toCharArray();
for(char c: arr){
//判断字符是左括号还是右括号
if(c=='('||c=='{'||c=='['){
//遇到左括号直接入栈
stack.push(c);
}else{
//遇到右括号
//1.栈是不是空的
if(stack.isEmpty()){
return false;
}
//2.判断栈顶元素
char left=stack.pop(); //直接弹出
if(!isMatch(left,c)){ //判断左右括号是不是匹配
return false;
}
//3.如果匹配处理下个字符
}
}
//所有字符都遍历完成
if(stack.isEmpty()){
//所有左括号都有右括号
return true;
}else{
//左括号多出来
return false;
}
}
public boolean isMatch(char left,char right){
if(left=='('){
return right==')';
}
if(left=='['){
return right==']';
}else{
return right=='}';
}
}
}