这个算法我觉得快要弄死我了
KMP解决字符串匹配问题,一段文本中某个特定的位置找出 某个特定的字符或模式。
BF算法简单暴力,算法复杂度高
S串,P串,在S中找到P
index i 标志 S i初始为0
index j 标志 P j初始为0
k表示 从S[i]和P[j]开始的能够匹配的字符的长度
一旦粗线 S[i+k]!=P[j],则i++,j=0,k=0
即P串只是向后滑动一个字符,算法复杂度为 O(n*m)
介绍KMP算法,可以优化算法到O(n+m)线性
KMP算法的核心在于增大向后滑动的程度,不像BF算法,只能向后滑动一个位置,KMP寻找最大滑动距离
核心思想:
P字符串为 abcdabd
每个位置作为截止点,找最大移动距离
最大移动距离的计算方法也很简单,前缀和后缀相等字串的长度,即为最大距离
这些计算过程,即为大名鼎鼎的p的next数组
我们看看
a next[0]=0
ab 木有公共子串 next[1]=0
abc 木有公共子串 next[2]=0
abcd 木有公共子串 next[3]=0
abcda 公共子串 a next[4]=1
abcdab 前缀 a,ab,abc,abcd 后缀 bcda,cda,da,a 最长的公共子串 ab ,长度为2 next[5]=2
abcdabd 木有公共子串 next[6]=0
计算next数组代码如下:
S串为BBC ABCDAB ABCDABCDABDE
http://chaoswork.com/blog/2011/06/14/kmp%E7%AE%97%E6%B3%95%E5%B0%8F%E7%BB%93/
http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html