//kmp 今天的比较难先简单过一遍不死扣了 等周末复习的时候再扣一下
[28].找出字符串中第一个匹配项的下标
func strStr(haystack string, needle string) int {
n:= len(needle)
if n == 0{
return 0
}
j := 0
next:=make([]int, n)
getNext(next,needle)
for i := 0; i < len(haystack); i++ {
for j>0 && haystack[i] != needle[j]{
j = next[j-1]
}
if haystack[i] == needle[j]{
j++
}
if j == n{
return i - j +1
}
}
return -1
}
func getNext(next []int,s string){
j:=0
next[0]= j
for i := 1; i < len(s); i++ {
for j > 0 && s[i] != s[j] {
j = next[j-1]
}
if s[i] == s[j]{
j++
}
next[i] = j
}
}
[459].重复的子字符串
func repeatedSubstringPattern(s string) bool {
//如果是重复字符串组成比如 abcabc 那么我 去头去尾连上
//bcabc abcab
//组成 bc abc abc ab 中间还会出现这个字符串那么就说明可以由这个组成
str:=[]byte(s)
ss:=string(str[1:])+string(str[:len(str)-1])
return strings.Contains(ss,s)
}
func repeatedSubstringPattern(s string) bool {
n:=len(s)
if n== 0{
return false
}
j := 0
next:= make([]int, len(s))
next[0] = 0
for i := 1; i < n; i++ {
for j>0 && s[i]!=s[j]{
j = next[j-1]
}
if s[i]==s[j]{
j++
}
next[i]=j
}
// next[n-1] 是最小前后缀的长度
if next[n-1]!=0&& n%(n-next[n-1])==0{
return true
}
return false
}