扩展KMP
e x k m p exkmp exkmp 求解的问题:对于给定的主串 S S S ,和模式串 T T T ,求出主串 S S S 的所有后缀与模式串 T T T 的最长公共前缀长度。
K M P KMP KMP 求解的问题是在主串 S S S 中模式串T出现的次数和位置, 扩 展 K M P 扩展KMP 扩展KMP 求解问题包含了 K M P KMP KMP 求解的问题,因为主串 S S S 中与模式串 T T T 的最长公共前缀长度等于 ∣ T ∣ |T| ∣T∣ 的后缀就是 K M P KMP KMP 所求。
e x k m p exkmp exkmp 算法求解过程实际是求两个数组的值:
n e t [ i ] net[i] net[i] : 模式串 T T T 的后缀 T s u f ( i ) Tsuf(i) Tsuf(i) 与模式串 T T T 本身的最长公共前缀长度 (net指next,C++11中next为保留字)
e x t e n d [ i ] extend[i] extend[i]:主串 S S S 的后缀 S s u f ( i ) Ssuf(i) Ssuf(i) 与模式串 T T T 的最长公共前缀长度
exkmp算法采用 递推求解 , e x t e n d [ i ] extend[i] extend[i] 的值可以由 e x t e n d [ 0.. i ] extend[0..i] extend[0..i] 和 n e t net net 数组的值求得。
算法推导:
设:主串 S S S ,长度 N N N ,模式串 T T T ,长度 M M M ,下标均从 0 0 0 开始。
假设 e x t e n d [ 0.. i ] extend[0..i] extend[0..i] 和 n e t net net 数组已知,现在正在求解 e x t e n d [ k ] extend[k] extend[k] 的值
设最远匹配位置为