2019独角兽企业重金招聘Python工程师标准>>>
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,重新开始新一轮的匹配。
例:在串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) 。
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]向后与依次执行匹配。
例:在S串“babcbabcabcaabcabcabcacabc”中查找T“abcabcacab”
未完待续