LC 28字符串简单第 42 / 95 题

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

Find the Index of the First Occurrence in a String

KMP字符串匹配
本机进度仅保存在当前浏览器

题目描述

给你两个字符串 haystack 和 needle,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始);不存在则返回 -1。

示例:haystack = "sadbutsad",needle = "sad",输出 0;needle = "but",输出 -1。

解题思路

  1. 朴素匹配逐起点比较最坏 O(n·m);KMP 利用已匹配前缀的信息避免文本指针回退。
  2. 先对模式串自匹配构建 next(失配)数组:next[i] 表示模式串 [0, i] 的相等最长真前后缀长度。
  3. 匹配时失配则模式串指针 j = next[j-1] 跳到该前缀继续比较,文本指针 i 永不回退,整体 O(n + m)。
  4. 理解 next 数组的构建过程本身也是一次模式串自匹配,两段代码结构几乎一致。

参考实现

查看参考实现Python · 建议先自行作答
def strStr(haystack, needle):
    n, m = len(haystack), len(needle)
    # 构建 KMP 失配数组
    nxt = [0] * m
    j = 0
    for i in range(1, m):
        while j and needle[i] != needle[j]:
            j = nxt[j - 1]
        if needle[i] == needle[j]:
            j += 1
        nxt[i] = j
    # 主匹配:文本指针不回退
    j = 0
    for i in range(n):
        while j and haystack[i] != needle[j]:
            j = nxt[j - 1]
        if haystack[i] == needle[j]:
            j += 1
        if j == m:
            return i - m + 1
    return -1

复杂度与归属

时间复杂度O(n + m)
空间复杂度O(m)
所属分类字符串
题源LeetCode 28

关联教程

返回题图鉴