kmp算法主要用于解决字符串匹配问题。
kmp实现需要一个前缀表(next数组)来记录每个子串的最长相等前后缀的长度,当主串和模式串不匹配时,模式串需要回退到子串最长相等前后缀的地方(因为主串的后缀和模式串的前缀一样)。
next数组:
def next(s):
l=[-1]*len(s)#数组整体右移,发生不匹配冲突时直接回退到next[j]
i=0#后缀末尾
j=-1#前缀末尾,同时也是最长相等前后缀长度,初始化-1
while i<len(s)-1:
if j==-1 or s[j]==s[i]:#匹配成功或者j无法回退,无法回退就重新匹配
i+=1
j+=1
l[i] = j
else:#匹配不成功,回退到next[j]
j=l[j]
return l
kmp算法:
def kmp(s,t):
i=0#主串指针
j=0#模式串指针
l=next(t)#获取next数组
while i<len(s) and j<len(t):
if j==-1 or s[i]==t[j]:#匹配成功或者无法回退(重新开始匹配)
i+=1
j+=1
else:#匹配不成功,用next数组回退
j=l[j]
if j==len(t):
return i-j#返回最开始出现的下标
else:
return -1