今天是kmp的专场,kmp是看一次会一次,做一次忘一次。
28. 实现 strStr()
kmp主要分为两部分,一部分是构建前缀表,另一部分是根据前缀表进行匹配。
两部分里面各包含一个如果不匹配就继续向前匹配的循环,这里是最难想的部分。
func strStr(haystack string, needle string) int {
lenn := len(needle)
next := make([]int,lenn)
next[0] = 0
j := 0
for i := 1; i < lenn; i++{
for j > 0 && needle[i] != needle[j]{
j = next[j - 1]
}
if needle[i] == needle[j]{
j++
}
next[i] = j
}
key := 0
for i := 0; i < len(haystack); i++{
for key > 0 && haystack[i] != needle[key]{
key = next[key - 1]
}
if haystack[i] == needle[key]{
key++
if key == lenn{
return i - key + 1
}
}
}
return -1
}
偷个懒直接截屏记录一下
459.重复的子字符串
重复的子字符串
拿到前缀表之后,判定条件为如果next的最后才是最大的,且被最长相等前后相减后的就是最小重复单元