力扣题解:459. 重复的子字符串

63 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第19天,点击查看活动详情

一、题目描述:

459. 重复的子字符串 - 力扣(LeetCode)

给定一个非空的字符串 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,流下了学了很多遍都没学会的泪水.

建议官方答案好好研究研究。

范文参考:

一句话让你秒懂双倍字符串的原理,充要条件一次性证明! - 重复的子字符串 - 力扣(LeetCode)

基于最小表示法/最大后缀的时间复杂度O(n),空间复杂度O(1)的算法 - 重复的子字符串 - 力扣(LeetCode)

字符串复制并掐头去尾,若存在重复则复制的字符串包含原字符串。 - 重复的子字符串 - 力扣(LeetCode)