LeetCode 20 有效的括号

LeetCode 20 有效的括号


题目:
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效
有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。

示例 1:

输入:s = "()"
输出:true
示例 2:

输入:s = "()[]{}"
输出:true
示例 3:

输入:s = "(]"
输出:false
示例 4:

输入:s = "([)]"
输出:false
示例 5:

输入:s = "{[]}"
输出:true


提示:

1 <= s.length <= 104
s 仅由括号 '()[]{}' 组成

题解:
此题我们使用数据结构中的栈结构来巧解此题
我们知道,一个有效的括号组合有以下特性

1.括号组的数量一定是偶数
2.括号组的数量如果是0则一定有效
3.每种类型的左括号和右括号数量相同
4.每一对括号内要么没有其他括号组,如果有,其他括号组一定也是有效括号组

我们按照以下规则处理:

剪枝
1.如果括号组数量是奇数直接返回False
2.如果括号组的数量如果是0直接返回True

遍历
1.如果括号是左括号,直接入栈
2.如果括号是右括号:
  a.如果栈顶括号是与之匹配的左括号,栈顶括号出栈
  b.其他所有情况直接返回False
3.如果括号组全部匹配完毕返回True

图解:

代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public boolean isValid(String s) {
int len = s.length();
if (len == 0) return true;
if (len % 2 != 0) return false;
char[] chars = s.toCharArray();
Stack<Character> stack = new Stack<>();
String signal = "{[(}])";
for (int i = 0; i < len; i++) {
int index = signal.indexOf(chars[i]);
if (index < 3) {
stack.add(chars[i]);
} else {
if (stack.isEmpty()) return false;
char c = stack.pop();
if (c != signal.charAt(index - 3)) {
return false;
}
}
}
return stack.isEmpty();
}