重复的子字符串
题目链接:重复的子字符串
方法一:暴力
流程
- 枚举所有的子串情况(不包括字符串本身)
- 判断子串长度是否合格
- 判断子串能重复构成整个字符串
- 例如:
s = “abcabbabcabd”
,ss = “abc”
- 将
s
划分为abb、abc、abd
,判断每个划分是否和ss
相同
- 例如:
func repeatedSubstringPattern(s string) bool {
n := len(s)
for i := 0; i < n-1; i++ {
if n%(i+1) != 0 {
// 表示当前子串不满足长度条件
continue
}
lenght := i + 1
st := true
for j := 1; j*lenght < n; j++ {
if s[:lenght] != s[j*lenght:j*lenght+lenght] {
// 当前子串和其中一部分不相同
st = false
break
}
}
if st {
return true
}
}
return false
}
方法二
两个概念
next[]
特性:n-next[n]
是字符串中的最小周期T0
- 字符串最小周期
T0
是所有周期的公约数
证明看y总的视频:LeetCode 459. 重复的子字符串(LeetCode究极班) - AcWing
**综上所述:**如果最小周期T0
能被字符串长度整除,表示有重复的子字符串
func repeatedSubstringPattern(s string) bool {
n := len(s)
s = " " + s
next := make([]int, n+1)
next[0] = -1
for i, j := 2, 0; i <= n; i++ {
for j > 0 && s[i] != s[j+1] {
j = next[j]
}
if s[i] == s[j+1] {
j++
}
next[i] = j
}
t := n - next[n]
return t < n && n%t == 0
}