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

浙公网安备 33010602011771号