标签:
在开始KMP算法之前,先来回顾一下字符串模式匹配的暴力法,具体的过程如下图所示:
注:图中两个串的匹配都是从1开始的,代码中的匹配都是从0开始的。
可以看到匹配主串的i的值是不断的回溯的,然而KMP三位大师发现这种回溯其实是不需要的,所以提出来这个算法来解决这个问题。
既然i值不能回溯了,也就是不能变小了,那么要考虑变化的就是j值了。为了能说清楚KMP算法,先以暴力算法为基础分析两个例子。
例1:
主串s=“abcdefgab”模式串p=“abcdex”,也就是上面的图中所示的问题。对于这个例子不难发现,模式串的首字母“a”与后面的串“bcdex”中的任意一个字符都相等,那么对于①中所示的那样,前五位字符分别相等。也就是说模式串的首字符“a”不可能与主串的第2位到第5位的字符相等。也就是说②③④⑤的判断是多于的。所以只需要保留①⑥就可以了。
注:图中两个串的匹配都是从1开始的,代码中的匹配都是从0开始的。
通过这个例子可以看出如果模式串中的首字符与后面的字符各不相同,那么在不成功匹配的时候,i不用回溯。只需要保持i的值不变,然后把j匹配到起始的位置。所以原来暴力算法的代码只需要改动else的部分修改为:
while(i < sLen && j < pLen) { if(s[i] == p[j]) { ++i; ++j; } else { j = 0; } }//while
但是这样做
是有一个前提的,那就是模式串的首字符与模式串的其它字符是不同的。但是如果不满足这个条件呢?也就是模式串的首字符不满足同其它的字符相异
。
例2:
主串s=
标签:
原文地址:http://www.cnblogs.com/stemon/p/4349239.html