KMP (Knuth-Morris-Pratt)算法是一种用于在一个文本串S内查找一个模式串P的字符串匹配算法。它是由Donald Knuth,Vaughn Pratt和James H. Morris在1977年设计的。 KMP算法的主要优点是利用了匹配失败的信息来减少模式串与文本串的匹配次数,从而提高了字符串匹配的效率。时间复杂度是 O(n+m)
下面是一个简单的 KMP 算法示例,它在文本串S中查找模式串P的第一个匹配位置:
def KMPSearch(pat, txt):
? ? M = len(pat)
? ? N = len(txt)
? ? # create lps[] that will hold the longest prefix suffix
? ? # values for pattern
? ? ?lps = [0]*M
? ? ?j = 0 # index for pat[]
? ? # Preprocess the pattern (calculate lps[] array)
? ? ?computeLPSArray(pat, M, lps)
? ? i = 0 # index for txt[]
? ? ?while i < N:
? ? ? ? if pat[j] == txt[i]:
? ? ? ? ? ? i += 1
? ? ? ? ? ? ?j += 1
? ? ? ? ?if j == M:
? ? ? ? ? ? print("Found pattern at index " + str(i-j))
? ? ? ? ? ? ?j = lps[j-1]
? ? ? ? # mismatch after j matches
? ? ? ? ?elif i < N and pat[j] != txt[i]:
? ? ? ? ? ? ?# Do not match lps[0..lps[j-1]] characters,
? ? ? ? ? ? # they will match anyway
? ? ? ? ? ? if j != 0:
? ? ? ? ? ? ? ? ?j = lps[j-1]
? ? ? ? ? ? ?else:
? ? ? ? ? ? ? ? i += 1
def computeLPSArray(pat, M, lps):
? ? len = 0 # length of the previous longest prefix suffix
? ? lps[0] = 0 # lps[0] is always 0
? ? i = 1
? ? # the loop calculates lps[i] for i = 1 to M-1
? ? while i < M:
? ? ? ? if pat[i] == pat[len]:
? ? ? ? ? ? ?len += 1
? ? ? ? ? ? ?lps[i] = len
? ? ? ? ? ? i += 1
? ? ? ? ?else:
? ? ? ? ? ? # This is tricky. Consider the example.
? ? ? ? ? ? # AAACAAAA and i = 7. The idea is similar
? ? ? ? ? ? # to search step.
? ? ? ? ? ? ?if len != 0:
? ? ? ? ? ? ? ? len = lps[len-1]
? ? ? ? ? ? else:
? ? ? ? ? ? ? ? lps[i] = 0
? ? ? ? ? ? ? ? i += 1
txt = "ABABDABACDABABCABAB"
pat = "ABABCABAB"
KMPSearch(pat, txt)
★关于WorkWin公司电脑监控软件★
WorkWin的使命是打造Work用途的Windows 电脑系统,有效规范员工上网行为,让老板知道员工每天在做什么(监控包括屏幕、上网在内的一举一动),限制员工不能做什么(禁止网购、游戏、优盘等)。
WorkWin基于纯软件设计,小巧易用,无需添加或改动任何硬件,使用一台管理机监控全部员工机电脑。历经南京网亚十余年精心打造,此时此刻每天都有成千上万企业电脑正在运行WorkWin,选择WorkWin选择“赢"。
版权所有,南京网亚计算机有限公司 。本文链接地址: KMP算法值得一看的一个例子