KMP经典算法与变形的应用(字符串partern匹配问题)

KMP经典算法与变形的应用(字符串partern匹配问题)

 1. 问题描述

求主串字符串a是否含有模式串字符串partern b,也就是匹配问题经典KMP算法是计算next[j]数组,然后每次移动若干位而不是暴力求解的每次移动到partern的首位来比较。

暴力求解的算法很明显时间复杂度是O(m*n),而KMP(三个发明者的首字母)算法 的时间复杂度是O(m+n),为什么时间复杂度是O(m+n),以及KMP算法的

关键点next[]数组的求解的精髓——相等的最长前缀后缀串长度数组的求解在下面进行介绍。

最后还会介绍一下KMP的next数组的变形(有些情形下将会提速)。

2.暴力求解BF

主串每次移动一个位置,每次斗鱼模式串partern进行比较,当遇到不相同元素的时候进行break结束当前循环,然后主串一定到下一个位置.....不用多说

 1 def bf(s, partern):
 2     start = 0
 3     while start <= (len(s) - len(partern)):
 4         partern_index = 0
 5         for i in xrange(start, start+len(partern)):
 6             if partern[partern_index] != s[i]:
 7                 break
 8             elif partern_index == (len(partern)-1):
 9                 return start
10             partern_index += 1
11         start += 1
12     return -1

3. KMP经典算法

3.1 next[]数组求解

3.2 KMP算法代码

3.3 KMP算法时间复杂度解释

4.KMP算法变形

猜你喜欢

转载自www.cnblogs.com/sunll9201/p/9998176.html