KMP算法

416 阅读1分钟

KMP算法理解

KMP算法用于计算在一个字符串中找到指定字符串出现位置的算法。 通常我们的处理思维是,按顺序查找,匹配不上重新匹配。 如字符串BBC ABCDAB ABCDABCDABDE中,查找ABCDABD出现的位置。

为了描述方便字符串为S[i],待匹配字符串为P[j]  
从S[0]P[0]开始匹配  
BBC ABCDAB ABCDABCDABDE  
ABCDABD  
不匹配,则i+1,S[1]P[0]匹配  
BBC ABCDAB ABCDABCDABDE  
 ABCDABD  
依次类推  
直到S[4]P[0]匹配上,i、j指针分别加一,继续匹配  
BBC ABCDAB ABCDABCDABDE  
    ABCDABD  
当匹配到i=10,j=6时发现匹配失败,则需要回溯到S[5]P[0]重新匹配  
依次类推,直到找到i[15-21]、j[0-6]完全匹配上结束  
BBC ABCDAB ABCDABCDABDE  
               ABCDABD  
通过上面的描述,我们可以发现当字符串匹配到S[10]P[6]时,S中已经匹配的字符串里面是有A的并且还有AB
BBC ABCDAB ABCDABCDABDE
    ABCDABD
我们完全可以从S中的第二个AB开始匹配,也就是S指针不变P指针前移4个单位
BBC ABCDAB ABCDABCDABDE
        ABCDABD
i=10、j=2 S[10]P[2]继续比较,发现不匹配后,再观察P[2]之前没有重复的字符,则可以从S[11]P[0]比较
BBC ABCDAB ABCDABCDABDE
           ABCDABD
按顺序比较后到S[17]P[6]时发现不匹配,再将P指针前移4个单位
BBC ABCDAB ABCDABCDABDE
               ABCDABD
i=17、j=2,匹配后继续指针加一匹配。直到完全匹配成功。得出字符串出现位置