
本文介绍一种基于栈的 Java 实现方法,用于判断字符串中的 {、[、( 是否满足严格嵌套顺序(即 ( 必须在 [ 内,[ 必须在 { 内),且所有括号均成对、正确闭合。
本文介绍一种基于栈的 Java 实现方法,用于判断字符串中的 `{`、`[`、`(` 是否满足严格嵌套顺序(即 `(` 必须在 `[` 内,`[` 必须在 `{` 内),且所有括号均成对、正确闭合。
要验证括号是否“按序嵌套且合法闭合”,关键在于两点:结构合法性(每对括号自身匹配)和层级合法性(嵌套必须遵循 { → [ → ( 的严格递降顺序)。普通括号匹配(如 LeetCode 20)仅检查匹配性,而本题额外要求:不允许 (a[b{c}d]e) 这类 { 出现在 ( 内部的反序嵌套。
解决方案是使用 栈(Stack)记录当前允许的最内层括号类型。栈中只存开括号,且必须严格按 { → [ → ( 顺序压入;每当遇到闭括号时,必须与栈顶开括号精确匹配,且匹配后弹出——最终栈为空才表示完全合法。
以下是完整、健壮的 Java 工具方法实现:
import java.util.*;
public class BracketValidator {
public static boolean isValidNested(String s) {
if (s == null) return false;
Deque<Character> stack = new ArrayDeque<>();
Map<Character, Character> pairs = Map.of(')', '(', ']', '[', '}', '{');
for (char c : s.toCharArray()) {
if (c == '(' || c == '[' || c == '{') {
// 检查嵌套顺序:新括号不能比栈顶“更外层”
if (!stack.isEmpty()) {
char top = stack.peek();
if ((c == '(' && top != '[') ||
(c == '[' && top != '{') ||
(c == '{' && !stack.isEmpty())) {
// '{' 只能作为最外层,若栈非空则已存在外层,非法
return false;
}
}
stack.push(c);
} else if (c == ')' || c == ']' || c == '}') {
if (stack.isEmpty() || stack.pop() != pairs.get(c)) {
return false;
}
}
}
return stack.isEmpty();
}
}✅ 正确示例验证:
- "([a]b)" → false(( 在 [ 外,违反顺序)
- "[a(b)c]" → true(( 在 [ 内,合法)
- "{a[b(c)d]e}" → true(( ⊂ [ ⊂ {,完全合规)
- "{a[b]c}" → true(无 ( 但 [ 在 { 内,仍合规)
⚠️ 注意事项:
- 该逻辑不依赖字符位置或计数,而是通过栈状态实时约束嵌套深度与类型;
- 空格、字母、数字、运算符等非括号字符被自动忽略;
- 若需支持 Unicode 或扩展括号(如 《》),需扩展 pairs 映射及顺序校验逻辑;
- 生产环境建议用 ArrayDeque 替代 Stack(后者已过时且线程不安全)。
总结:此方案以 O(n) 时间复杂度和 O(n) 空间复杂度,精准建模了“括号类型层级不可逆”的业务约束,是处理多级优先嵌套校验的经典栈模式实践。