KMP算法

来源:互联网 发布:广联达清标软件 编辑:程序博客网 时间:2024/05/16 03:57

一直以来KMP算法都不太理解,现在抽空进行了好好分析和研究一下,KMP的算法核心在于匹配串,根据匹配串的特征进行比对,KMP算法思路启发演示:

思路启发一:

思路启发二:

思路启发三(我们增加next数组来,什么叫next数组?next数组就是当不匹配的时候,模式字符串进行移动的索引的向导):


思路启发四:



实际代码流程演示:

void get_next(){//字符串索引0表示字符串的总个数next[1]=0;front=0,end=1;while(end < src[0]){if(0==front || src[front] == src[end]){front++;//前缀end++;//后缀next[end]=front;}else{//回溯front=next[front];}}}


代码图解:


KMP算法优化:

后来有人发现:KMP算法是有缺陷的,比如我们源字符串aaaabcde,子串aaaax

其中很容易得到next数组为01234。如图:


根据上面的结论我们可以将算法进行优化:

void get_next(){//字符串索引0表示字符串的总个数next[1]=0;front=0,end=1;while(end < src[0]){if(0==front || src[front] == src[end]){front++;end++;if(next[end]!=next[front]){next[end]=front;}else{next[end]=next[front];}}else{//回溯front=next[front];}}}
最后KMP查找字符串代码如下:
<pre name="code" class="cpp">int Find_KMP(String S,String T,int nPos){int i=pos;int j=1;int next[255];get_next(T,next);while(i< S[0] && j<T[0]){if(0==j || S[i]==T[j]){i++;j++;}else{j=next[i];//匹配失败从next数组获取新索引匹配}}if(j>T[0]){//表示匹配成功return i-T[0];}return -1;}





0 0
原创粉丝点击