Java作业问题:如何移除字符串中第二个出现的子串?
问题分析与解决方案
你的需求是移除字符串中第二次出现的指定子串,但现有代码存在几个核心问题:
- 硬编码子串长度为3:代码直接判断
sub.charAt(0)、sub.charAt(1)、sub.charAt(2),如果子串长度小于3,直接触发StringIndexOutOfBoundsException;如果子串长度大于3,根本无法匹配。 - 未区分“第几次出现”:现有逻辑是只要匹配到子串就跳过,会移除所有匹配项,而非仅第二次。
- 遍历边界处理错误:
(i+2)<string.length()的判断不严谨,未根据子串长度动态计算边界。
正确实现思路
要实现仅移除第二次出现的子串,核心步骤是:
- 遍历原字符串,找到所有子串出现的起始索引
- 若出现次数≥2,截取原字符串中第二次子串之前的部分和第二次子串之后的部分进行拼接
- 若出现次数<2,直接返回原字符串
代码实现
public static String removeSecondOccurrence(String string, String sub) { // 边界情况处理:子串为空或长度大于原字符串,直接返回原串 if (sub.isEmpty() || sub.length() > string.length()) { return string; } int subLength = sub.length(); int occurrenceCount = 0; int secondStartIndex = -1; // 遍历所有可能的子串起始位置 for (int i = 0; i <= string.length() - subLength; i++) { boolean isMatch = true; // 检查当前位置是否匹配子串 for (int j = 0; j < subLength; j++) { if (string.charAt(i + j) != sub.charAt(j)) { isMatch = false; break; } } if (isMatch) { occurrenceCount++; // 记录第二次出现的起始索引 if (occurrenceCount == 2) { secondStartIndex = i; break; // 找到第二次出现后即可停止遍历 } // 跳过当前子串的后续字符,避免重复匹配(比如子串是"aa",原串是"aaaa") i += subLength - 1; } } // 存在第二次出现,拼接结果 if (secondStartIndex != -1) { return string.substring(0, secondStartIndex) + string.substring(secondStartIndex + subLength); } else { // 没有第二次出现,返回原串 return string; } }
代码说明
- 边界处理:先排除子串为空或过长的情况,避免无效遍历和越界。
- 匹配逻辑:通过嵌套循环逐字符对比,适配任意长度的子串。
- 计数与记录:每匹配一次就增加计数,当计数到2时记录起始索引并停止遍历,提升效率。
- 结果拼接:利用
substring方法截取第二次子串前后的部分,拼接得到最终结果。
测试你给出的用例:
- 原串
"kiaebiariaediaeia",假设子串是"ia",第二次出现的位置是索引4,移除后得到"kiaebiardiaeia",符合预期。 - 原串
"bird and i",若子串是"and",不会触发越界,代码会正确处理。
内容的提问来源于stack exchange,提问作者CompilingConfusion
相关产品推荐
相关产品推荐

