加载中...

NC149 kmp算法

题目描述

给你一个文本串 T ,一个非空模板串 S ,问 S 在 T 中出现了多少次

数据范围:1≤len(S)≤500000,1≤len(T)≤1000000
要求:空间复杂度O(len(S)),时间复杂度O(len(S)+len(T))

解题思路和代码

class Solution:
    def kmp(self , S: str, T: str) -> int:
        if S=='':return 0
        h,l=len(T),len(S)
        i,j=0,0
        arr=[]
        pre_next=self.get_next(S)
        while i<h and j<l:
            if S[j]==T[i]:#当字符匹配成功时
                i+=1
                j+=1
                if j==l:#当j长度等于S字符串长度时
                    arr.append(1)
                    j=pre_next[j]
            else:
                j=pre_next[j]
        return len(arr)
#获取next数组是kmp算法的核心问题
    def get_next(self,s):
        n=len(s)
        res=[-1]#res[0]=1代表如果第一个字符就不匹配,就往后移一位
        i,k=0,-1 # i是next数组的下标
        while i<n:
            if(k==-1 or s[i]==s[k]): #最初和当s[i]==s[k]时此时
                res.append(k+1)  #s[i+1]=k+1
                i+=1
                k+=1
            else:   #其他时候将res[k]赋值给k
                k=res[k]
        return res
        
posted @ 2022-06-11 20:41  最大的敌人是自律  阅读(155)  评论(0)    收藏  举报