KMPアルゴリズム(python)
(1)ブルートフォース検索アルゴリズム
複雑さ:O(m * n)
def strMacth(t,p):
m,n=len(t),len(p)
i,j=0,0
while i<m and j<n:
if p[j]==t[i]:
j,i=j+1,i+1
else:
j,i=0,i-j+1
if j==n:
return i-j
else:
return -1
t="ababcabcacbab"
p="abcac"
x=strMacth(t,p)
print(x)
#结果:5
(2)アルゴリズム
(2.1)pnextテーブルを解決するプロセス:
末尾の線を削除し、頭の前に-1を追加して、次のようにします。
(2.2)KMPコードの実装:
複雑さ:O(n)
def gen_pnext(p):
#生成针对p中各位置i的下一检查位置函数,用于KMP算法
i,k,m=0,-1,len(p)
pnext=[-1]*m #初始数组全部元素为-1
while i<m-1: #生成下一个pnext元素值
if k==-1 or p[i]==p[k]:
i,k=i+1,k+1
pnext[i]=k #设置pnext元素
else:
k=pnext[k] #退回更短相同前缀
return pnext
def KMP(t,p,pnext):
j,i=0,0
n,m=len(t),len(p)
while j<n and i<m:
if i==-1 or t[j]==p[i]:
j,i=j+1,i+1
else:
i=pnext[i]
if i==m:
return j-i
return -1
t="ababcabcacbab"
p="abcac"
pnext=gen_pnext(p)
x=KMP(t,p,pnext)
print(x)
#结果:5