本文介绍如何通过递归方法去除字符串中的重复字符,重点修正原始代码中终止条件错误(误用 str.length() 而非 abc.length())及 StringBuilder 状态管理问题,并提供完整可运行的解决方案。
本文介绍如何通过递归方法去除字符串中的重复字符,重点修正原始代码中终止条件错误(误用 `str.length()` 而非 `abc.length()`)及 stringbuilder 状态管理问题,并提供完整可运行的解决方案。
在 Java 中使用递归去除字符串重复字符,核心在于:逐个检查原字符串每个字符是否已出现过,仅将首次出现的字符追加到结果中。原始代码存在一个关键逻辑错误——递归终止条件判断的是 i == str.length(),而 str 是动态构建的结果字符串,其长度随递归推进不断变化,无法作为遍历原字符串的索引边界;正确做法是依据原字符串 abc 的长度来控制递归深度。
以下是修复后的完整实现:
public class Main {
public static void main(String[] args) {
String abc = "appnacolllege";
// 初始化空 StringBuilder 和 26 字母布尔数组(仅适用于全小写 a-z)
Strchk(abc, 0, new StringBuilder(), new boolean[26]);
}
public static void Strchk(String abc, int i, StringBuilder str, boolean[] stroc) {
// ✅ 正确终止条件:遍历完原字符串所有字符
if (i == abc.length()) {
System.out.println(str);
return;
}
char currChar = abc.charAt(i);
// ✅ 仅对小写字母 'a'–'z' 有效;若含大写、数字或符号,需扩展逻辑(见下方说明)
if (currChar >= 'a' && currChar = 'a' && currChar <p><strong>运行输出:</strong> </p><pre class="brush:php;toolbar:false;">apncole
✅ 关键修正说明:
- 终止条件由 i == str.length() 改为 i == abc.length(),确保遍历完整输入字符串;
- StringBuilder 初始化使用 new StringBuilder()(等价于 new StringBuilder("")),无需额外空格;
- str.append(currChar) 是链式调用且修改原对象,因此递归中传递的是同一引用——这要求回溯时不能简单“撤销”追加(本例无回溯需求,因只做单向构建);
- 增加字符范围校验('a'–'z'),避免 currChar - 'a' 下标越界(如遇大写字母 'A' 会得负数索引)。
⚠️ 注意事项:
- 当前方案假设输入仅含小写英文字母。如需支持大小写混合,可统一转为小写(Character.toLowerCase(currChar))后再计算索引;
- 如需支持任意 Unicode 字符(如中文、数字、符号),应改用 HashSet
替代 boolean[26] 数组; - 递归深度等于字符串长度,对超长字符串(如 >10000 字符)可能引发 StackOverflowError,生产环境建议优先使用迭代解法。
该递归实现简洁清晰,体现了“分治+状态标记”的经典思路,适合理解递归结构与字符去重本质。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











