前言
kmp算法更深一步理解了,希望再遇到能写出来。
内容
一、重复的子字符串
给定一个非空的字符串 s
,检查是否可以通过由它的一个子串重复多次构成。
构建新的字符串str=s+s
func repeatedSubstringPattern(s string) bool {
s1:=s+s
s2:=s1[1:len(s1)-1]
if strings.Contains(s2,s){
return true
}
return false
}
kmp
字符串的长度-最长公共前后缀的长度, 正好可以被 字符串的长度 整除,说明有重复的子字符串
主要是把前缀表next[ ]求出来,然后根据题目要求,利用和前缀表的关系求解
func repeatedSubstringPattern(s string) bool {
n:=len(s)
if n==0{
return false
}
j:=0
next:=make([]int,n)
next[0]=j
for i:=1;i<n;i++{//for 不是 if
for j>0&&s[i]!=s[j]{
j=next[j-1]
}
if s[i]==s[j]{
j++
}
next[i]=j//i是永远向前的
}
// next[n-1] 最长相同前后缀的长度
if next[n-1] != 0 && n%(n-next[n-1]) == 0 {
return true
}
return false
}
最后
字符串就到这吧,写个总结。