原题
字符串简单1 种解法

#28找出字符串中第一个匹配项的下标

返回 needle 在 haystack 中首次完整出现的起始下标,不存在则返回 -1。

#字符串#字符串匹配

原题

给你两个字符串 haystackneedle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回  -1

示例 1:

输入:haystack = "sadbutsad", needle = "sad"
输出:0
解释:"sad" 在下标 0 和 6 处匹配。
第一个匹配项的下标是 0 ,所以返回 0 。

示例 2:

输入:haystack = "leetcode", needle = "leeto"
输出:-1
解释:"leeto" 没有在 "leetcode" 中出现,所以返回 -1 。

提示:

  • 1 <= haystack.length, needle.length <= 104
  • haystackneedle 仅由小写英文字符组成

查看原题

解题主线

  1. 起点最多枚举到 n - m;从每个候选起点向后逐字符核对。

解法 1:朴素字符串匹配

枚举每个可能起点,并比较长度为 m 的窗口。

  • 时间复杂度: O((n - m + 1) × m) 最坏

  • 空间复杂度: O(1)

JAVA
final class Solution {
    public int strStr(String haystack, String needle) {
        int n = haystack.length();
        int m = needle.length();
        // 只枚举还能容纳完整 needle 的候选起点。
        for (int start = 0; start + m <= n; start++) {
            int offset = 0;
            while (offset < m && haystack.charAt(start + offset) == needle.charAt(offset)) {
                offset++;
            }
            // 连续匹配 m 个字符时,当前起点就是首次出现位置。
            if (offset == m) return start;
        }
        return -1;
    }
}

边界与易错点

  • needle 为空时按题意返回 0。
  • needle 比 haystack 长时循环不执行,应自然返回 -1。

整理来源

由旧仓库源码复核、去重并整理;展示代码已按 Java 21 语义修正明显问题。

  • easy/Q028_strStr.java