题目

给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
数据范围
1 <= s.length <= 104
s 仅由括号 '()[]{}' 组成
测试用例
示例1
java
输入:s = "()"
输出:true
示例2
java
输入:s = "()[]{}"
输出:true
示例3
java
输入:s = "(]"
输出:false
示例4
java
输入:s = "([])"
输出:true
示例5
java
输入:s = "([)]"
输出:false
题解(时间On,空间O(n+|Σ|))
java
import java.util.*;
class Solution {
// 移除类级别的成员变量 res,因为函数内部已经有完备的逻辑返回结果
public boolean isValid(String s) {
int n = s.length();
// 1. 剪枝优化:如果长度是奇数,肯定无法两两成对,直接返回 false
if (n % 2 == 1) {
return false;
}
// 2. 建立映射表:Key 为右括号,Value 为对应的左括号
// 这样在遍历到右括号时,可以快速找到它"期望"匹配的左括号
Map<Character, Character> map = new HashMap<>();
map.put(')', '(');
map.put(']', '[');
map.put('}', '{');
// 3. 使用 Deque 作为栈使用(Java 官方推荐替代 Stack 类)
// 栈的特性:后入先出,非常适合处理嵌套结构
Deque<Character> stack = new LinkedList<>();
for (int i = 0; i < n; i++) {
char temp = s.charAt(i);
// 4. 如果当前字符是右括号
if (map.containsKey(temp)) {
// 情况 A:栈为空,说明右括号多出来了,没有左括号可以匹配
// 情况 B:栈顶元素不是对应的左括号,说明括号顺序错误(如 "(]")
if (stack.isEmpty() || stack.peek() != map.get(temp)) {
return false;
} else {
// 匹配成功,将栈顶的左括号弹出
stack.pop();
}
} else {
// 5. 如果当前字符是左括号,直接压入栈中等待匹配
stack.push(temp);
}
}
// 6. 最后检查栈是否为空
// 如果为空,说明所有左括号都找到了匹配的右括号;否则说明左括号多了
return stack.isEmpty();
}
}
思路
这道题总体来说我觉得可以将难度提到普通,主要确实很考验对栈使用的基本功,整体代码也有很多细节,对如何判false这设计也其实非常巧妙。整体逻辑我就不重复了,看代码备注就行了,总体来说这道题很不错,能加深我们如何对栈的使用