Featured image of post 28. 找出字符串中第一个匹配项的下标

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

题目描述

给你两个字符串 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 仅由小写英文字符组成

解法一:KMP 算法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
func strStr(haystack string, needle string) int {
    nn := len(needle)
    if nn == 0 {
        return 0
    }
    next := make([]int, nn)
    for i, j := 0, 1; j < nn; j++ {
        for i > 0 && needle[i] != needle[j] {
            i = next[i-1]
        }
        if needle[i] == needle[j] {
            i++
        }
        next[j] = i
    }
    for i, j := 0, 0; i < len(haystack); i++ {
        for j > 0 && haystack[i] != needle[j] {
            j = next[j-1]
        }
        if haystack[i] == needle[j] {
            j++
        }
        if j == nn {
            return i - nn + 1
        }
    }
    return -1
}
comments powered by Disqus
Built with Hugo
主题 StackJimmy 设计