给定一个非空的字符串 s
,检查是否可以通过由它的一个子串重复多次构成。
示例 1:
输入: s = "abab"
输出: true
解释: 可由子串 "ab" 重复两次构成。
示例 2:
输入: s = "aba"
输出: false
示例 3:
输入: s = "abcabcabcabc"
输出: true
解释: 可由子串 "abc" 重复四次构成。 (或子串 "abcabc" 重复两次构成。)
提示:
1 <= s.length <= 104
s
由小写英文字母组成
题解:
KMP算法:
// 时间复杂度:O(n)
// 空间复杂度:O(n)
func repeatedSubstringPattern(s string) bool {
// 初始化各种变量和前缀表
n := len(s)
j := 0
next := make([]int, n)
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
}
评论前必须登录!
注册