有效括号验证代码Bug排查:测试用例([}}])输出异常
问题排查与修复
你的代码在处理不匹配括号时存在逻辑漏洞,导致错误输出true,核心问题有两个:
- 遇到不匹配的右括号未及时终止判断:比如测试用例
([})](推测你描述的([}}])是笔误,因为它长度为5,你的代码开头会直接返回false),当遍历到第一个}时,栈顶是[,不匹配,但你的代码仅跳过弹出操作,继续执行后续循环,最终可能因其他操作让栈意外清空,错误返回true。 - 未处理栈空时的右括号:如果字符串中出现无对应左括号的右括号(比如开头就是
}),你的代码会直接跳过处理,最后栈为空时错误返回true。
修正后的代码
class Solution { public boolean isValid(String s) { Stack<Character> st = new Stack<>(); int len = s.length(); if (len % 2 != 0) { return false; } for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); // 左括号直接入栈 if (c == '(' || c == '{' || c == '[') { st.push(c); } else { // 栈为空,说明右括号无对应左括号,直接返回false if (st.isEmpty()) { return false; } char topChar = st.peek(); // 匹配则弹出栈顶,不匹配直接返回false if ((c == ')' && topChar == '(') || (c == '}' && topChar == '{') || (c == ']' && topChar == '[')) { st.pop(); } else { return false; } } } // 最终栈为空则所有括号匹配完成 return st.isEmpty(); } }
关键修复说明
- 合并右括号处理逻辑:所有右括号统一进入
else分支,先检查栈是否为空,为空直接返回false,避免无对应左括号的非法情况。 - 不匹配立即终止:只要右括号和栈顶左括号不匹配,直接返回
false,不会继续执行后续循环,确保错误被及时捕获。 - 简化冗余判断:去掉原代码中重复的
!st.isEmpty()检查,让逻辑更简洁清晰。
测试类似([})]的用例时,遍历到}时会发现与栈顶[不匹配,直接返回false,符合预期。
内容的提问来源于stack exchange,提问作者shanu
相关产品推荐
相关产品推荐

