Java字符串匹配代码问题:查找"funf"的次数与位置异常求助
问题分析与解决
你的代码当前默认统计重叠的子串匹配,但如果你的需求是统计非重叠的匹配,就会出现结果不符合预期的情况。比如在测试字符串的funfunf片段中,代码会识别出2次funf(重叠的两个匹配:起始位置16和19,0-based),但如果预期只统计1次非重叠匹配,结果就会出错。以下是针对两种需求的修正方案:
方案1:修正为统计非重叠匹配
修改点1:调整calculation方法的计数逻辑
找到匹配后,直接跳过当前子串的长度,避免重叠计数:
public int calculation(String s, String s1) { int howManyTimes = 0; int s1Len = s1.length(); // 处理子串为空或比原串长的边界情况 if (s1Len == 0 || s1Len > s.length()) { return 0; } for (int i = 0; i <= s.length() - s1Len; ) { int counter = 0; for (int j = 0; j < s1Len && s1.charAt(j) == s.charAt(i+j); j++) { counter++; } if (counter == s1Len) { howManyTimes++; // 找到匹配后,跳过整个子串长度,避免重叠 i += s1Len; } else { // 未匹配,移动一个字符继续查找 i++; } } return howManyTimes; }
修改点2:调整位置查找的起始索引
找到一个匹配后,从当前匹配的结束位置开始下一次查找,而非下一个字符:
int position = -1; while ((position = findNextWordPosition(s, s1, position == -1 ? 0 : position + s1.length())) != -1) { System.out.println(position + 1); // 转换为1-based索引输出 }
方案2:保留重叠匹配(验证原代码正确性)
如果你的需求确实是统计所有重叠匹配,原代码的calculation方法逻辑是正确的。此时检查输入是否符合预期:
- 确认输入的原字符串和子串是否正确(比如是否有多余空格、大小写问题)
- 原代码的位置输出是1-based索引,比如0-based的16会输出17,这是正确的。
测试验证
针对你的测试字符串qqqqqqqqqqqqqqqqfunfunfwewewewewewqwyeqet和子串funf:
- 非重叠匹配:次数为1,位置为17(1-based)
- 重叠匹配:次数为2,位置为17、20(1-based)
内容的提问来源于stack exchange,提问作者skyRain
相关产品推荐
相关产品推荐

