LeetCode459. 重复的子字符串

重复的子字符串

题目链接:重复的子字符串

方法一:暴力

流程

  • 枚举所有的子串情况(不包括字符串本身)
  • 判断子串长度是否合格
  • 判断子串能重复构成整个字符串
    • 例如: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
}
  • 11
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值