Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述:
给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。
示例 1:
输入: s = "abab"
输出: true
解释: 可由子串 "ab" 重复两次构成。
示例 2:
输入: s = "aba"
输出: false
示例 3:
输入: s = "abcabcabcabc"
输出: true
解释: 可由子串 "abc" 重复四次构成。 (或子串 "abcabc" 重复两次构成。)
提示:
- 1 <= s.length <= 10^4
- s 由小写英文字母组成
二、思路分析:
把长度为N的字符串按照1/2/3/4/5/6/(N/2)个字符一份,切成许多份,然后挨个比较每一份是否相同就好
具体执行的时候,当然很多情况是不用考虑的:
比如长度为10的字符串,只需要考虑1/2/5三种情况就好了,
因为10根本不可能分成3个/4个一份的不是吗?
三、AC 代码:
func repeatedSubstringPattern(s string) bool {
l := len(s)
half := l / 2
for i := 1; i <= half; i++ {
if l%i != 0 {
continue
}
total := l / i
j := 1
for ; j < total; j++ {
if s[(j-1)*i:j*i] != s[j*i:(j+1)*i] {
break
}
if j == total-1 {
return true
}
}
}
return false
}
四、总结:
看到kmp,流下了学了很多遍都没学会的泪水.
建议官方答案好好研究研究。