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

Java中如何手动实现字符串子串查找?现有代码逻辑是否正确?

你的代码同时存在逻辑错误和实现问题,具体问题如下:

  • 匹配失败后未重置子串指针
    当部分字符匹配成功、后续匹配失败时,你仅移动主串下标,没有将子串下标otherIndex重置为0,会导致后续匹配完全错位。例如主串为abac、目标子串为ac时,前两位a匹配、b与c不匹配后,otherIndex会停留在1,后续主串的a、c都会和子串下标1的c对比,最终漏判实际存在的子串。
  • 匹配成功的判断条件错误
    你设置的判断条件otherIndex == s.length()-1完全不符合执行逻辑:
    1. 若子串长度为1,s.length()-1为0,匹配到对应字符后otherIndex会加1变为1,永远无法满足判断条件,会漏判所有长度为1的子串。
    2. 子串长度大于1时,匹配到最后一位字符后otherIndex会加1,此时值等于子串总长度,你设置的条件永远无法触发正确的成功返回。
  • 匹配失败后主串指针移动逻辑错误
    部分匹配失败后,主串指针不能直接加1,需要回退到本次匹配起始位置的下一位,否则会漏判匹配起始位置交错的场景。例如主串为ababc、子串为abc时,若第一次匹配从下标0开始失败,主串指针需要回退到下标1重新匹配,否则会错过后续的正确子串。

修正后的代码示例:

public int lookFor(String s) {
    final int EXIST = 1;
    final int NOT_EXIST = -1; 
    int thisIndex = 0;
    int otherIndex = 0;
    
    // 提前处理边界情况:子串为空/子串长度大于主串直接返回不存在
    if (s == null || s.length() == 0 || s.length() > this.mainString.length())
        return NOT_EXIST;
    
    while(thisIndex < this.mainString.length()) {
        char thisNext = this.mainString.charAt(thisIndex);
        char otherNext = s.charAt(otherIndex);
        
        if (thisNext == otherNext) {
            thisIndex++;
            otherIndex++;
        } else {
            // 匹配失败,主串指针回退到本次匹配起始点的下一位,子串指针重置为0
            thisIndex = thisIndex - otherIndex + 1;
            otherIndex = 0;
        }
        
        // 子串所有字符全部匹配完成,返回存在标识
        if (otherIndex == s.length())
            return EXIST;       
    }
    return NOT_EXIST;
}

内容的提问来源于stack exchange,提问作者EladO O

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 19:36:04