KMP算法

来源:互联网 发布:linux安装apache服务器 编辑:程序博客网 时间:2024/06/04 00:31

           设模式串(子串)为"p0...pm-1",KMP匹配算法的思想是:当模式串中的字符pj与主串中相应的字符Si不相等时,因其前j个字符("p0...pj-1")已经得到匹配,所以如果"p0...pk-1"="pj-k...pj-1"相同,这是可令pk与Si进行比较,从而使i无须每次都回退到0.

           在KMP算法中,依据模式串的next函数值实现子串的滑动。若令next[j] = k,则next[j]表示当模式串中的pj与主串中相应的字符不相等时,令模式串的pk与主串相应字符进行比较。

next函数的定义如下:

 -1,当j=0时

max{k | 0 < k < j且"p0...pk-1"="pj-k...pj-1"}

0,其他情况。

 

#include<stdio.h>#include<string.h>void GetNext(char *SubStr, int *next){if(!SubStr || !next)return;int j = 0;int k = -1;next[0] = -1;int nLen = strlen(SubStr);while(j < nLen){if(k == -1 || SubStr[j] == SubStr[k])//k==-1.表示回退到最初的位置了{++j;++k;next[j] = k;}elsek = next[k];}}int KMP(char *Str, char *SubStr, int pos, int *next){if(!Str || !SubStr || !next)return -1;int i = pos - 1;int j = -1;int nLen = strlen(Str);int nSubLen = strlen(SubStr);while(i < nLen && j < nSubLen){if(j == -1 || Str[i] == SubStr[j]){++i;++j;}elsej = next[j];}if(j >= nSubLen)return i - nSubLen;elsereturn -1;}void main(){char Str[100];char SubStr[50];int next[50];int pos;while(scanf("%s %s",Str,SubStr) != EOF){GetNext(SubStr, next);pos = KMP(Str, SubStr, 0, next);if(pos > -1){printf("匹配位置:%d\n",pos);puts(&Str[pos]);}}}


 

原创粉丝点击