Java递归字符串截取方法实现求助:提取指定字符间子串
Java递归实现包裹字符间子串的解决方案
明确需求:实现递归方法,接收字符串、唯一出现的开字符和闭字符,返回两者之间的子串(不含包裹字符)。比如输入"Hello (there] how are you?"、'('、']',返回"there"。
你的两段代码存在的问题
- 第一段代码:逻辑完全偏离需求,仅不断截取字符串首字符,仅判断开头两个字符是否为开/闭字符后返回空,既未跟踪是否找到开字符,也未收集中间目标子串,递归方向错误。
- 第二段代码:存在语法错误(
newString未初始化就直接使用),且无返回值;虽用indexOf获取了字符索引,但完全未结合递归逻辑实现子串提取。
正确的递归实现
我们可以通过辅助递归方法传递状态(是否已找到开字符、当前收集的子串),主方法对外提供简洁的调用入口:
public class SubstringExtractor { // 对外暴露的主方法 public static String getSubstring(String str, char open, char close) { // 调用辅助递归方法,初始状态:未找到开字符,收集的子串为空 return extractRecursive(str, open, close, false, ""); } // 辅助递归方法,处理核心逻辑 private static String extractRecursive(String str, char open, char close, boolean foundOpen, String current) { // 递归终止条件:字符串为空,返回当前收集的内容 if (str.isEmpty()) { return current; } char firstChar = str.charAt(0); String remaining = str.substring(1); if (firstChar == close) { // 遇到闭字符,终止递归,返回已收集的内容 return current; } else if (firstChar == open) { // 遇到开字符,标记状态为已找到,继续递归处理剩余字符串 return extractRecursive(remaining, open, close, true, current); } else if (foundOpen) { // 已找到开字符,将当前字符加入收集的子串,继续递归 return extractRecursive(remaining, open, close, true, current + firstChar); } else { // 未找到开字符,直接跳过当前字符,继续递归 return extractRecursive(remaining, open, close, false, current); } } // 测试示例 public static void main(String[] args) { String input = "Hello (there] how are you?"; System.out.println(getSubstring(input, '(', ']')); // 输出:there } }
递归逻辑说明
- 终止条件:当处理的剩余字符串为空,或者遇到闭字符时,返回已收集的子串。
- 状态跟踪:通过
foundOpen布尔值标记是否已经找到开字符,避免收集开字符之前的无关内容。 - 逐步收集:一旦找到开字符,后续遇到的字符(直到闭字符)都会被加入结果子串,直到触发终止条件。
另一种简洁实现(无需辅助参数)
如果不需要严格的递归遍历,也可以结合indexOf简化代码(本质是利用字符串API实现,适合快速需求场景):
public static String getSubstring(String str, char open, char close) { if (str.isEmpty()) { return ""; } int openIdx = str.indexOf(open); if (openIdx == -1) { return ""; } String afterOpen = str.substring(openIdx + 1); int closeIdx = afterOpen.indexOf(close); if (closeIdx == -1) { return ""; } return afterOpen.substring(0, closeIdx); }
内容的提问来源于stack exchange,提问作者ComputerScienceHelp
相关产品推荐
相关产品推荐

