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

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数组最后一个值) = 重复的长度,用整体长度/重复的长度看是否有余数

你可能感兴趣的:(python,开发语言)