Leetcode 459

题目:重复的子字符串

学习资料:代码随想录

初始思路

  • 暴力求解,满足长度可以是当前子串的整数倍;遍历验证子串可以重复构成
  • n%i == 0;其中i就是代表子串长度
  • 要所有的j都满足,s[j] == s[j-i]

学习后 

  • KMP算法,要能想到,这个最短重复的子串其实就是,最长相等前后缀不包含的那部分。(前缀或后缀不包含的那部分)
  • 那么就是先求出next数组,其中数组的最后一个值,就是可以代表这个串最长相等前后缀的长度。那么利用这个来判断。
  • 满足条件的情况是:首先最长相等长度不能为0,为0就说明不存在相等,那就不可能重复。其次是n必须是最短子串的整数倍

实现过程

  • 注意kmp实现过程,还需消化
#思路一
        n = len(s)
        for i in range(1, n//2+1):
            if n % i == 0:
                for j in range(i, n):
                    if s[j] != s[j-i]:
                        temp = 0
                        break
                    else:
                        temp = 1
            if temp == 1:
                return True
        return False
#思路二
    def repeatedSubstringPattern(self, s: str) -> bool:

        n = len(s)
        nxt = self.getNext(s, n)
        #最小重复串的长度就是总长度减去最长相等前后缀的长度
        re = n - nxt[-1]

        if  nxt[-1] != 0 and  n % re == 0 :
            return True
        return False

        #KMP
    def getNext(self, s, n):
        j = 0
        next_ = [0] * n
        for i in range(1, n):

            while j > 0 and s[j] != s[i]:
                j = next_[j-1]
            
            if s[j] == s[i]:
                j += 1
            
            next_[i] = j
        return next_

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值