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算法变形