算法记录 | Day8字符串KMP算法

64 阅读2分钟

算法记录 | Day8字符串KMP算法

KMP算法

公共前后缀比较好理解,代码随想录里的这篇讲的很清楚了,可以点击跳转看动画演示,但是如何求next数组呢?

虽然也有动画吧,但咱还是不理解,所以只有抠代码了。

题解中比较好理解的是if needle[k+1] == needle[i] 的情况,这种情况下只需要k不断向前加一就可以了,但当遇到不等的情况,具体操作是什么就分析不清了,以下是debug的视频,对于我来讲,这样会清晰看到k值和next数组的变化,再自己动手画一画会理解很多。

emm该视频只能本地播放,之后有视频床再放吧

LeetCode 28-实现strStr()

题目描述:给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。

def strStr(self, haystack: str, needle: str) -> int:
    # 求next数组
    def getNext(s):
        l = len(s)
        next_s = [' ' for i in range(l)]
        k = -1
        next_s[0] = k
        for i in range(1, len(s)):
            while(k>-1 and s[k+1]!=s[i]):
                k = next_s[k]
                if s[k+1] == s[i]:
                    k += 1
                    next_s[i] = k
        return next_s         

题目链接:leetcode.cn/problems/fi…

解题思路
  • 用上刚学的kmp数组
class Solution:
    def strStr(self, haystack: str, needle: str) -> int:
        # 求next数组
        def getNext(s):
            l = len(s)
            next_s = [' ' for i in range(l)]
            k = -1
            next_s[0] = k
            for i in range(1, len(s)):
                while(k>-1 and s[k+1]!=s[i]):
                    k = next_s[k]
                if s[k+1] == s[i]:
                    k += 1
                next_s[i] = k
            return next_s
        # 找下标
        a=len(needle)
        b=len(haystack)
        if a==0:
            return 0
        next_s=getNext(needle)
        p=-1
        for j in range(b):
            while p>=0 and needle[p+1]!=haystack[j]:
                p=next_s[p]
            if needle[p+1]==haystack[j]:
                p+=1
            if p==a-1:
                return j-a+1
        return -1
难点

emmm本身就难,明天再看吧。