【问题描述】[中等]
【解答思路】
1. 栈
如果是一个合法的括号序列,遍历到一个右括号(i)时,那么它的前一个括号(i-1)必定是它的另一半(左括号)。反之不是它的另一半或者前面没有括号时,那这个序列必定是非法括号序列。
思路:利用一个stack辅助保存括号,遇见左括号时入栈对应的右括号,遇到右括号时
- 栈空,证明前面没有匹配括号 多余的右括号
- 栈非空弹出栈顶元素进行比较操作
最后判断栈是否为空 - 空 括号匹配
- 非空 多余的左括号
要么在入栈时根据不同类别入栈右括号 要么出栈的时候根部不同类别作判断 至少进行一次分类讨论
时间复杂度:O(N) 空间复杂度:O(N)
优秀代码
class Solution {
public boolean isValid(String s) {
int len = s.length();
if (s == null || len == 0) return true;
if (len % 2 != 0) {
// 如果长度为奇数,必然至少有一个括号没有匹配
return false;
}
Deque<Character> stack = new ArrayDeque<>();
for (char ch : s.toCharArray()) {
if (ch == '(') {
stack.addLast(')');
} else if (ch == '[') {
stack.addLast(']');
} else if (ch == '{') {
stack.addLast('}');
} else if