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

递归提取最外层括号内子串的方法问题

问题解决:递归提取最外层括号内的子串

问题分析

你的代码存在两个核心问题:

  1. 违反了禁止使用循环的约束,使用了for循环遍历字符串;
  2. 逻辑偏差:原代码寻找的是与第一个左括号匹配的右括号(即括号深度归0的第一个右括号),而需求是保留第一个左括号之后的所有内容直到最后一个右括号,因此多余的右括号被错误截断。

解决方案

我们用纯递归实现,分两步处理:

  • 递归定位第一个左括号的位置;
  • 递归查找字符串中最后一个右括号的位置;
  • 若右括号在左括号之后,返回两者之间的子串;否则返回空字符串。

完整代码如下:

public class Main {
    public static void main(String[] args) {
        String seq = "1(234)67";

        System.out.println(clean(seq));  // 输出: "234"
        System.out.println(clean("123(45))"));  // 输出: "45)"
        System.out.println(clean("x)"));  // 输出: ""
        System.out.println(clean(")x("));  // 输出: ""
    }

    public static String clean(String seq) {
        if (seq.isEmpty()) {
            return "";
        }
        // 递归跳过第一个左括号之前的所有字符
        if (seq.charAt(0) != '(') {
            return clean(seq.substring(1));
        }
        // 找到当前字符串中最后一个右括号的索引
        int lastRightIdx = findLastRightParen(seq, seq.length() - 1);
        // 确保右括号在左括号之后,返回中间子串
        return lastRightIdx > 0 ? seq.substring(1, lastRightIdx + 1) : "";
    }

    // 递归查找最后一个右括号的索引
    private static int findLastRightParen(String s, int currentIdx) {
        if (currentIdx < 0) {
            return -1;
        }
        if (s.charAt(currentIdx) == ')') {
            return currentIdx;
        }
        // 递归向前查找
        return findLastRightParen(s, currentIdx - 1);
    }
}

代码说明

  1. 递归定位左括号:通过不断截取字符串前缀,直到找到第一个以(开头的子串;
  2. 递归查找最后一个右括号:从字符串末尾开始递归向前遍历,找到第一个(即原字符串最后一个))的位置;
  3. 子串提取:如果找到的右括号在左括号之后,提取两者之间的子串(不含括号本身);否则返回空字符串。

测试结果

运行代码后,输出与期望完全一致:

clean("1(234)67") -> "234"
clean("123(45))") -> "45)"
clean("x)") -> ""
clean(")x(") -> ""

内容的提问来源于stack exchange,提问作者Kaizen985

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 16:02:00