题目
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = "()"
输出:true
1
2
2
示例 2:
输入:s = "()[]{}"
输出:true
1
2
2
示例 3:
输入:s = "(]"
输出:false
1
2
2
提示:
1 <= s.length <= 10
4s
仅由括号'()[]{}'
组成
题解
java
/**
* 括号对缓存
*/
private static final Map<Character, Character> BRACKET_PAIR = new HashMap<>(3);
static {
BRACKET_PAIR.put('(', ')');
BRACKET_PAIR.put('{', '}');
BRACKET_PAIR.put('[', ']');
}
public boolean isValid(String s) {
// 用于暂时存放未匹配完的开括号
Stack<Character> container = new Stack<>();
for(int i = 0, length = s.length(); i < length; i ++) {
Character bracket = s.charAt(i);
// 弹出括号为闭括号
if(!BRACKET_PAIR.containsKey(bracket)
// 若待匹配栈为空或待匹配开括号与弹出闭括号不能配对
&& (container.isEmpty() || !bracket.equals(BRACKET_PAIR.get(container.pop())))) {
return false;
}
// 开括号 暂存待匹配
if(BRACKET_PAIR.containsKey(bracket)) {
container.push(bracket);
}
// 否则 弹出的闭括号能和暂存的开括号配对 弹出并跳过
}
return container.isEmpty();
}
public boolean isValid2(String s) {
// 括号原子是成对存在的 直接通过替换的方式快速处理
// 效率较低
while (s.contains("()") || s.contains("{}") || s.contains("[]")) {
s = s.replace("()", "");
s = s.replace("{}", "");
s = s.replace("[]", "");
}
return s.isEmpty();
}
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
36
37
38
39
40
41
42
43
44
45
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
36
37
38
39
40
41
42
43
44
45