给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = "()" 输出:true
示例 2:
输入:s = "()[]{}" 输出:true
示例 3:
输入:s = "(]" 输出:false
解析:如果遇到左括号,就将其变成右括号进栈。然后遇到相等的括号就出栈。比如 '}' == '}' ']' == ']' ')' == ')'
第一种情况,字符串里左方向的括号多余了 ,所以不匹配。
第二种情况,括号没有多余,但是 括号的类型没有匹配上。
第三种情况,字符串里右方向的括号多余了,所以不匹配。
public boolean isValid(String s){
Deque<Character> stack = new LinkedList<Character>();
if (s.length()==0){
return true;//空字符串也正确;
}
if (s.length() % 2!=0){
return false;//奇数字符串直接false;
}
for (int i=0;i<s.length();i++){
if (s.charAt(i) == '('){
//遇到左括号,将相匹配的右括号入栈;方便进行比较
stack.push(')');
}else if (s.charAt(i) == '['){
//遇到左括号,将相匹配的右括号入栈;方便进行比较
stack.push(']');
}else if (s.charAt(i) == '{'){
//遇到左括号,将相匹配的右括号入栈;方便进行比较
stack.push('}');
}else if (stack.isEmpty() || stack.peek() != s.charAt(i)) {
//2 遇到不匹配的括号;
//3 :字符串没有遍历完,栈为空了,说明右括号多了
return false;
}else {
//遇到相匹配的括号;(']' ==']' '}'=='}' ')'==')')栈头出栈;
stack.poll();
}
}
if (!stack.isEmpty()){
//1.遍历完字符串,然后栈还不为空的话,说明左括号多了;
return false;
}
//满足条件的字符串:
return true;
}