题目描述: 给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = “()”
输出:true
示例 2:
输入:s = “()[]{}”
输出:true
示例 3:
输入:s = “(]”
输出:false
示例 4:
输入:s = “([)]”
输出:false
示例 5:
输入:s = “{[]}”
输出:true
解题思路:
1.在此之前我已经能匹配单个小括号(),而这题还加上了中括号和花括号的匹配,但是解题的思路还是一样的。
2.首先,遍历字符串的每一个字符,并判断当前字符
3.当前字符如果是左括号就进栈,
4.当前字符如果是右括号则出栈,并判断出栈的元素是否能和当前元素相匹配,比如假如当前元素是"[ “,如果出栈元素不是” ]",就返回false,同时也要ps:
注意一点
java自带的Stack类,pop出栈方法如果栈中没有元素是不会返回null的,而是会报空栈异常
code:
class Solution {
public boolean isValid(String s) {
Stack<String> stack= new Stack<String>();
String ch1;
//遍历字符串的每一个字符
for(int i=0;i<s.length();i++){
String ch=s.charAt(i)+"";
//左括号则入栈
if("(".equals(ch) || "{".equals(ch) || "[".equals(ch)){
stack.push(ch);
}
//遇到右括号则出栈,判断出栈元素是否和右括号匹配
else{
switch(ch){
case ")":
if(stack.isEmpty()){
return false;
}
ch1=stack.pop();
if( ch1==null || !ch1.equals("(")){
return false;
}
break;
case "}":
if(stack.isEmpty()){
return false;
}
ch1=stack.pop();
if(ch1==null || !ch1.equals("{")){
return false;
}
break;
case "]":
if(stack.isEmpty()){
return false;
}
ch1=stack.pop();
if(ch1==null ||!ch1.equals("[")){
return false;
}
break;
default :break;
}
}
}
//判断栈内是否还有剩余元素,如果有,则不是有效字符串
return stack.isEmpty();
}
}