有效的括号

有效的括号

LeetCode 第 20 题 简单题

给定一个只包括 ‘(‘,’)’,’{‘,’}’,’[‘,’]’ 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。

示例1

输入:s = “()”
输出:true

示例2

输入:s = “()[]{}”
输出:true

示例3

输入:s = “(]”
输出:false

查看提示
  • 1 <= s.length <= 104
  • s 仅由括号 '()[]{}' 组成
栈解题思路

用 map 去记录对应的括号匹配情况
循环字符串
栈为空,或 top 元素不为对应的匹配值,将这个括号压入栈
top 元素和当前括号匹配上就出栈
栈为空就说明括号是闭合的,不为空说明不匹配,有可能是顺序问题,也可能是数量问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class Solution {
public boolean isValid(String s) {
// 直接排除奇数长度的字符串
if (s.length() % 2 != 0) {
return false;
}
// 用 map 去记录对应的括号匹配情况
Map<Character, Character> map = new HashMap<Character, Character>() {{
put(')', '(');
put(']', '[');
put('}', '{');
}};

// 通过栈去解决
Stack<Character> stack = new Stack<>();
// 循环字符串
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
// 排除非法字符
if (!(map.containsKey(c) || map.containsValue(c))) {
return false;
} else {
// 栈为空,或 top 元素不为对应的匹配值,将这个括号压入栈
if (stack.isEmpty() || stack.peek() != map.get(c)) {
stack.push(c);
} else {
// top 元素和当前括号匹配上就出栈
stack.pop();
}
}
}
// 栈为空就说明括号是闭合的,不为空说明不匹配,有可能是顺序问题,也可能是数量问题
return stack.isEmpty();
}
}