kmp模式匹配算法

KMP字符串模式匹配算法: 是由Knuth,Morris,Pratt共同提出的模式匹配算法,其对于任何模式和目标序列,均可以在线性时间内完成匹配查找,而不会发生退化。KMP算法的核心跳转表next进行了多个层面的优化和抽象,使得KMP算法进行模式匹配的原理显得不那么直白。算法

KMP算法是一个很是优秀的字符串模式匹配算法,我这样说,你们可能以为有点唐突,那咱们就先来看一下朴素匹配算法。优化

朴素匹配算法: 将目标串S中某个位置i起始的子串和匹配串T相比较。即从 j=0 起比较 S[i+j] 与 T[j],若相等,则在目标串 S 中存在以 i 为起始位置匹配成功的可能性,继续日后比较( j逐步增1 ),直至与T串中最后一个字符相等为止,不然改从S串的下一个字符起从新开始进行下一轮的"匹配",即将串T向后滑动一位,即 i 增1,而 j 退回至0,从新开始新一轮的匹配。spa

例:在串S=”abcabcabdabba”中查找T=” abcabd”字符串

从T[0]一直比较到T[5]才与S[5] 不等。 这样就匹配失败了,T串向后移动一位原理

一开始T[0]与S[1]就不相等,匹配失败,T串继续向后移动一位。。。。。。程序

一直移动到T串的T[0]与S[3]对齐时,发现目标串与匹配串彻底相同,算法结束,此时的时间复杂度为 O(m*n) ,而后回到今天的主角---->KMP算法,他的时间复杂度只有 O(m+n) 。im

KMP字符串模式匹配算法: 当目标串S中的某个子部S[m...m+(i-1)]与T串的前i个字符T[1...i]相匹配时,若是S[m+i]与T[i+1]匹配失败,程序不会像朴素匹配算法那样,将T[1]与S[m+1]对其,而后由S[m+1]向后逐一进行匹配,而是会将模式串T向后移动i+1 - next[i+1]个字符,使得T[next[i+1]]与S[m+i]对齐,而后再由S[m+i]向后与依次执行匹配。next

例:在S串“babcbabcabcaabcabcabcacabc”中查找T“abcabcacab”img

未完待续移动

相关文章
相关标签/搜索