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

Leetcode 28. Implement strStr() 代码运行失败问题咨询

代码逻辑疏漏分析

你的strStr实现运行测试用例haystack = "hello"、needle = "ll"时返回-1而非预期结果2,共有3处核心逻辑错误:

  • 匹配字符后无差别清空已匹配缓存
    只要执行了if分支的字符匹配逻辑、完成i/j自增后,代码会无条件执行result = "",刚拼接的匹配字符会被立刻清空,永远无法攒出和needle等长的匹配串。比如匹配到索引2位置的第一个'l'时,刚把字符拼入result,下一行就直接把result置空,后续就算匹配到第二个'l'也会被立即清空,最终result永远不可能和完整的needle相等。
  • 不匹配场景下指针未正确回退
    当当前位置字符不相等时,代码没有做指针回退逻辑:如果此前已经匹配了部分needle字符,遇到不匹配情况时,i需要退回到本次匹配起始位置的下一位,j需要重置为0重新开始匹配。现有逻辑无论是否匹配都直接执行i++,j也不会重置,会直接跳过潜在的匹配起始点。
  • 匹配成功时i指针重复自增
    进入if匹配分支时已经执行了一次i++,出分支后又会无条件执行一次i++,相当于匹配到有效字符时i一次跳2位:比如匹配到索引2的第一个'l'时,i先自增到3,紧接着又被加1到4,直接跳过了索引3位置的第二个'l',根本无法完成两个连续'l'的匹配。

额外提示:逐字符拼接字符串做匹配判断效率很低,完全可以通过双指针位置直接判断是否匹配完成,不需要额外维护result字符串。

修正后的可运行参考代码:

class Solution {
    public int strStr(String haystack, String needle) {
        if (needle.length() == 0) {
            return 0;
        }
        int i = 0;
        int j = 0;
        while (i < haystack.length()) {
            if (haystack.charAt(i) == needle.charAt(j)) {
                j++;
                // 已匹配完needle所有字符,直接返回起始下标
                if (j == needle.length()) {
                    return i - needle.length() + 1;
                }
                i++;
            } else {
                // 不匹配时回退指针:i退到本次匹配起点的下一位,j重置为0
                i = i - j + 1;
                j = 0;
            }
        }
        return -1;
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 16:06:26