拓展KMP算法详解Blog:http://blog.youkuaiyun.com/dyx404514/article/details/41831947
我自己的笔记部分:
拓展KMP(笔记)
拓展KMP是在KMP的基础上得到的。
首先有以下几点:
样例表:
i
0
1
2
3
4
5
6
S
a
a
a
a
b
a
a
T
a
a
a
a
a
extend
4
3
2
1
0
2
1
next
4
4
3
2
1
S:长度为n的母串 T:长度为m的子串
Extend:
Extend[i]表示T与S[I,n-1]的最长公共前缀
Next[i]表示T[I,m-1]与T数组的最长公共前缀
递推结论:
由next[1]= 4得出 T[0,3] = T [1,4] => T[0,2] = T[1,3]
由extend[0]= 4 得出 S[0,3] = T[0,3] => S[1,3] = T[1,3]
那么可以得出 S[1,3] = T[0,2]
那么我们在进行匹配时可以转化为直接判断 S[1,3] 与T[0,2] 是否匹配
由 以上 可得出 S[ po, P ] = T[ 0 , P-po] => S[k+1,P] = T[k-po+1,P-po] len=next[k-po+1]
(注:
其中 po表示得出extend最远距离初始的下标 ,P表示由extend得出的以匹配的最远距离的下标, k表示当前下标 )
更新:
1k+len<P时 => extend[k+1]=len
2k+len>=P时 => 从S[p+1] 和 T[P-k+1]开始匹配,直到失配,得到extend[k+1]+(k+1) 大于P,更新P和po;
拓展KMP复杂度:
O(n+m) (n为母串长,m为子串长)