20.有效的括号

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

有效字符串需满足:

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

示例 1:

1
2
输入:s = "()"
输出:true

示例 2:

1
2
输入:s = "()[]{}"
输出:true

Solution

首先考虑用栈的思想,如果遇到左括号,就入栈,碰到了右括号,就出栈,对比栈顶元素和右括号是否匹配

注意到括号都是对应的,所以可以用Map简化操作

需要的考虑的特殊情况:

  • 只有左括号
  • 只有右括号
  • 空集
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
class Solution {
public boolean isValid(String s) {
// 将字符串转换为字符数组
char[] ans = s.toCharArray();
// 创建一个 HashMap 存储右括号和对应的左括号
HashMap<Character, Character> map = new HashMap<>();
map.put(')', '(');
map.put('}', '{');
map.put(']', '[');
// 创建一个栈来存储左括号
Deque<Character> stack = new ArrayDeque<>();
// 遍历字符数组
for (int i = 0; i < ans.length; i++) {
// 如果当前字符是左括号,则压入栈中
if (map.containsValue(ans[i])) {
stack.push(ans[i]);
} else {
// 如果当前字符是右括号
// 如果栈为空或栈顶元素与当前右括号不匹配,则返回 false
if (stack.isEmpty() || stack.peek() != map.get(ans[i])) {
return false;
}
// 如果匹配,则弹出栈顶元素
stack.pop();
}
}
// 最后如果栈为空,则说明括号匹配完全,返回 true;否则返回 false
return stack.isEmpty();
}
}