You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 15:48:25