文章目录
- 题目概述
- 错误解题
- 正确解题
- 小结
题目概述
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
错误题解
暴力解法但忽略了左括号必须以正确的顺序闭合。
class Solution {
public boolean isValid(String s) {
int a = 0; // 记录圆括号 ()
int b = 0; // 记录大括号 {}
int c = 0; // 记录方括号 []
int len = s.length();
for (int i = 0; i < len; i++) {
char ch = s.charAt(i); // 使用 char 而非 String
if (ch == '(') {
a += 1;
} else if (ch == ')') {
a -= 1;
if (a < 0) return false; // 如果关闭括号过早出现,返回 false
} else if (ch == '{') {
b += 1;
} else if (ch == '}') {
b -= 1;
if (b < 0) return false; // 同理,处理大括号
} else if (ch == '[') {
c += 1;
} else if (ch == ']') {
c -= 1;
if (c < 0) return false; // 处理方括号
}
}
// 如果所有括号都匹配,a, b, c 应该都为 0
return a == 0 && b == 0 && c == 0;
}
}
正确题解
正确的判断方式:
括号不仅要数量匹配,还必须确保闭合的顺序是正确的。因此,这个问题需要使用栈来解决。当你遇到左括号时,将其压入栈中;当遇到右括号时,检查栈顶是否是对应的左括号,如果匹配则弹出栈顶。如果所有括号处理完毕后栈为空,说明括号匹配,否则说明不匹配。
class Solution {
public boolean isValid(String s) {
int n = s.length();
if (n % 2 == 1) {
return false;
}
Map<Character, Character> pairs = new HashMap<Character, Character>() {{
put(')', '(');
put(']', '[');
put('}', '{');
}};
Deque<Character> stack = new LinkedList<Character>();
for (int i = 0; i < n; i++) {
char ch = s.charAt(i);
if (pairs.containsKey(ch)) {
if (stack.isEmpty() || stack.peek() != pairs.get(ch)) {
return false;
}
stack.pop();
} else {
stack.push(ch);
}
}
return stack.isEmpty();
}
}
作者:力扣官方题解
链接:https://leetcode.cn/problems/valid-parentheses/solutions/373578/you-xiao-de-gua-hao-by-leetcode-solution/
来源:力扣(LeetCode)
小结
- 括号匹配问题不仅需要数量匹配,还需要确保顺序和嵌套是正确的。
- 解决这类问题时,应该使用栈数据结构来记录每个打开的括号,依次匹配关闭的括号。
通过这些分析可以理解到,仅依赖计数器的方式不适合解决这种嵌套结构的验证问题,栈是更合适的工具。