Java重复括号检测代码错误排查:返回结果不符问题
排查重复括号检测代码的错误:输入“((a+b)(c+d))”误判为存在重复括号
这段代码在处理表达式“((a+b)(c+d))”时错误返回了true,但实际上这个表达式并没有重复括号(没有同一子表达式被无意义的多层括号包裹)。下面是错误原因分析和修正方案:
错误原因
原代码的逻辑是:遇到右括号时,弹出栈中元素直到左括号,统计弹出的元素数量count,如果count==0就判定存在重复括号。但这个逻辑有漏洞:
- 对于“((a+b)(c+d))”的最外层右括号,此时栈里只剩下对应的最外层左括号——因为前面的
(a+b)和(c+d)子表达式在处理各自的右括号时,已经把内部元素和对应的左括号全部弹出栈了。 - 处理最外层右括号时,
while(s.peek() != '(')循环根本不会执行,count保持为0,代码因此误判为存在重复括号。 - 本质问题:代码只统计当前右括号与对应左括号之间未被处理过的元素,但外层括号包裹的是已经处理完成的子表达式(这些内容已经被弹出栈),导致无法正确识别外层括号内实际包含有效内容。
修正方案
我们需要调整判断逻辑:不是统计弹出元素的数量,而是检查当前括号对内部是否包含有效内容(操作数或运算符)。如果括号内只有其他括号(没有实际运算内容),才判定为重复括号。
修正后的代码:
import java.util.Stack; public class DuplicateParentheses { public static boolean isDuplicate(String str) { Stack<Character> s = new Stack<>(); for (int i = 0; i < str.length(); i++) { char curr = str.charAt(i); if (curr == ')') { boolean hasValidContent = false; // 弹出直到遇到左括号,检查是否有有效内容 while (s.peek() != '(') { char poppedChar = s.pop(); // 只要遇到运算符或操作数,就标记为有有效内容 if (poppedChar != '(' && poppedChar != ')') { hasValidContent = true; } } s.pop(); // 弹出对应的左括号 // 如果括号内没有有效内容,说明是重复括号 if (!hasValidContent) { return true; } } else { s.push(curr); } } return false; } public static void main(String[] args) { String test1 = "((a+b)(c+d))"; System.out.println(isDuplicate(test1)); // 输出false,符合预期 String test2 = "((a+b)+((c+d)))"; System.out.println(isDuplicate(test2)); // 输出true,正确识别c+d的重复括号 String test3 = "((a+b))"; System.out.println(isDuplicate(test3)); // 输出true,正确识别重复括号 } }
修正逻辑说明
- 遇到右括号时,遍历栈直到左括号,过程中检查是否出现非括号的有效内容(操作数或运算符)。
- 如果全程没找到有效内容,说明当前括号对是空的或者仅嵌套了其他无意义括号,直接返回
true。 - 否则弹出左括号继续处理,遍历完所有字符后返回
false。
内容的提问来源于stack exchange,提问作者Tanush Garg
相关产品推荐
相关产品推荐

