You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 22:14:57