LeetCode 459. 重复的子字符串

171 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述:

459. 重复的子字符串

给定一个非空的字符串 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) (leetcode-cn.com)