递归提取最外层括号内子串的方法问题
问题解决:递归提取最外层括号内的子串
问题分析
你的代码存在两个核心问题:
- 违反了禁止使用循环的约束,使用了
for循环遍历字符串; - 逻辑偏差:原代码寻找的是与第一个左括号匹配的右括号(即括号深度归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); } }
代码说明
- 递归定位左括号:通过不断截取字符串前缀,直到找到第一个以
(开头的子串; - 递归查找最后一个右括号:从字符串末尾开始递归向前遍历,找到第一个(即原字符串最后一个)
)的位置; - 子串提取:如果找到的右括号在左括号之后,提取两者之间的子串(不含括号本身);否则返回空字符串。
测试结果
运行代码后,输出与期望完全一致:
clean("1(234)67") -> "234" clean("123(45))") -> "45)" clean("x)") -> "" clean(")x(") -> ""
内容的提问来源于stack exchange,提问作者Kaizen985
相关产品推荐
相关产品推荐

