题目:给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。
分析:
栈是先进后出,当遍历s的每个字符时,碰到左括号就进栈,碰到右括号就出栈,如果出栈的括号不能跟这个右括号相匹配,那么一定不是有效的括号。当遍历结束以后,若栈内还有括号,那么这个括号也不是有效的括号。
class Solution {
public boolean isValid(String s) {
//如果数组长度为奇数,一定不是有效的括号
if(s.length()%2!=0){
return false;
}
//定义一个哈希表存储括号
Map<Character,Character> map = new HashMap<>();
map.put('(',')');
map.put('[',']');
map.put('{','}');
//栈先进后出,如果碰到左括号,那么入栈,一旦碰到右括号,那么最后一个入栈的一定要是匹配的左括号,不然就不是有效的括号
Stack<Character> stack = new Stack<>();
for(int i =0;i<s.length();i++){
if(s.charAt(i)=='('||s.charAt(i)=='{'||s.charAt(i)=='['){
//入栈
stack.push(s.charAt(i));
}else{
if(stack.empty()||s.charAt(i)!=map.get(stack.pop())){//栈内为空说明栈内没有左括号,stack.pop()表示出栈,map.get(key)得到的是value
return false;
}
}
}
//如果s遍历结束以后,栈内还有括号,那么一定不是有效的括号
if(!stack.empty()){
return false;
}
return true;
}
}