代码随想录day9|28. 找出字符串中第一个匹配项的下标459. 重复的子字符串

本文介绍了KMP算法,包括如何构造next数组以寻找子字符串首次出现的位置,以及如何通过next数组检测字符串中是否存在重复的子字符串模式。作者详细解释了算法的工作原理和两个相关函数get_next和repeatedSubstringPattern的实现。
摘要由CSDN通过智能技术生成

class Solution:
    def get_next(self,_next , s):
        # i,j j是前缀,i是后缀,两种情况
        _next[0] = 0
        j = 0
        for i in range(1,len(s)):
            while s[i]!=s[j] and j >0:
                j=_next[j-1]
            if s[i]==s[j]:
                j+=1
                _next[i]=j 
        return _next

    def strStr(self, haystack: str, needle: str) -> int:
        if len(needle) == 0:
            return -1
        _next = [0]*len(needle)
        _next =self.get_next(_next,needle)
        j=0
        for i in range(len(haystack)):
            while j > 0 and haystack[i] != needle[j]:
                j = _next[j - 1]
            if haystack[i] == needle[j]:
                j += 1
            if j == len(needle):
                return i - len(needle) + 1
        return -1

28. 找出字符串中第一个匹配项的下标 用kmp算法专门解决父字符串中是否包含子字符串问题,首先获得next数组,这是子字符串的前缀表,每个位置是以该位置为止的子字符串前缀(从首字母开始到该位置结束)的最大相等前后缀,每个位置的最大相等前后缀用i,j双指针来求,i遍历子字符串是后缀的结尾,j是前缀的结尾,对于每个当前位置,都用i和j分成了前后缀,同时j也是最大相等前后缀的长度,如果s[i]和s[j]相同就i,j一起加,不同的话就找j-1位置的前缀表下标看是否相同

另外strStr函数在得到next表之后,i遍历父串,j遍历子串,j遍历完就结束,相等时一起加一,不等时while找前一个的next数组对应的下标

class Solution:
    def get_next(self,_next,s):
        _next[0]=0
        j=0
        for i in range(1,len(_next)):
            while j>0 and s[i] !=s[j]:
                j=_next[j-1]
            if s[i] == s[j]:
                j+=1
                _next[i]=j
        return _next
    def repeatedSubstringPattern(self, s: str) -> bool:
        if len(s) ==0:
            return False
        _next = [0] * len(s) 
        _next=self.get_next(_next,s)
        if _next[-1]!=0 and len(s) % (len(s)-_next[-1]) ==0:
            return True
        else:
            return False

459. 重复的子字符串 主要不好想到长度-最长相等前后缀长度(next数组最后一个值) = 重复的长度,用整体长度/重复的长度看是否有余数

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值