子串匹配算法主要设计思路:充分利用已匹配过信息,尽量减少匹配次数。
kmp子串匹配算法即利用以上设计思路,通过对子串本身的重复模式进行检查,求出每次已匹配串中的最大前缀匹配数。
举例如下:
假设查找子串b是否出现串a中,子串b由{b1,b2, b3, ... bm}组成, 串a由{a1,a2,a3, ... an}组成:
采用归纳假设方法:假设当前b1 ~b(i-1)与a(k) ~ a(k-i)匹配,但是b(i)与a(k-i+1)不匹配,如果按照最初的设计思路,下次比较将从b1与a(k+1)开始比较,但是如果b1的某个前缀与以b(i-1)为后缀的两个子串匹配,假设匹配长度为l,则下次比较可以跳过从b(1) ~ b(l)的比较,直接比较b(l+1)与a(k-i+1);
简单思路则如上;
对应该算法的时间复杂度主要通过算法比较流程观察:仅遍历一次a串,而无回溯过程,故复杂度为O(n),计算子串的匹配长度可提前计算,计算方法可采用归纳方法推演,具体参考《算法引论》算法:Compute_Next(B, m)