KMP算法:字符串匹配算法,通过辅助函数跳过不必要的扫描,提高匹配效率。
例如:
从abcdef中找到bcd可以一次性匹配成功
从abbcd中找到bcd:在b时匹配失败 需要向后移动一位重新开始匹配 因为b与b相等
从 abcebcdef找到待匹配字符串bcd 时:bc匹配成功,e开始失败,下一轮寻找如果从bc中的c开始匹配就会很浪费时间,因为b≠c,从c开始匹配肯定不成功,哪里匹配失败就从哪里重新开始匹配即可,bce中e开始失败 那么就从e重新开始匹配。
kmp算法就是要告诉我们应该从哪里开始匹配才是最佳搜索方法,避免不必要的匹配过程,为此,专门有前缀函数来帮助我们 当遇到匹配失败的情况时应该后移几位开始新的匹配。
公式:S=Q-L
S:移动位数
Q:已匹配位数
L:既是自身(已匹配的字符串中)真后缀又是自身最长前缀的字符串长度
(注释L:abcd 的后缀有:abcd、bcd、cd、d;真后缀就是不包含自身的后缀。abcd前缀有:abcd、abc、ab、a)
在上述中bcd匹配abcebcdef时,第一次是匹配成功bc,即Q=2,L=0,∴S=2,由向b后移两位到e重新开始匹配
例2:
在字符串中abcbababaabcbdf匹配
ababaca 字符串
Q=5
ababa的真后缀有:baba、aba、ba、a
前缀有:ababa、abab、aba、ab、a
既是真后缀又是自身最长前缀的字符串是:aba ∴L=3 S=5-3=2 应该向后移动两位开始下一轮匹配