20. 有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
思路
- s 为空? => 返回
true/false,可商量 - s 的长度为奇数 => 不可匹配
- 怎么匹配?何时匹配 => 遇到右括号才匹配
遇到左括号压入栈
遇到右括号,将左括号出栈,与右括号进行匹配
最终代码
class Solution {
public boolean isValid(String s) {
if(s == null || s.length() == 0) {
return false;
}
if(s.length() % 2 != 0) {
return false;
}
Deque<Character> stack = new ArrayDeque();
for(int i = 0; i < s.length(); i++) {
char ch = s.charAt(i);
if(isLeftParenthese(ch)) {
stack.push(ch);
} else {
if(stack.isEmpty()) {
// 右括号比左括号多
return false;
}
char left = stack.pop();
if(!isMatch(left, ch)) {
return false;
}
}
}
return stack.isEmpty();
}
private boolean isLeftParenthese(char c) {
return (c == '(') || (c == '{') || (c == '[');
}
private boolean isMatch(char left, char right) {
if(left == '(') {
return right == ')';
} else if(left == '{') {
return right == '}';
} else if(left == '[') {
return right == ']';
} else {
return false;
}
}
}