KMP算法

来源:互联网 发布:iphone mac连接 编辑:程序博客网 时间:2024/06/03 00:20

参考博文:http://www.cnblogs.com/Yan-C/p/3792015.html
博文写得很清晰,推荐去看看

next[]数组求解

遇到过2种next[]数组,也是懵逼,不过思想大致还是差不多,就是算最大的相同前缀串和后缀串。
这2中next[]数组一种以-1开始,一种以0开始。以下还是以教科书上的-1为准吧。

//NEXT数组,未优化void getnext(char *s){    int next[81]={-1,0};    int i=0,j=-1,l=strlen(s);    while(i<l)        if(j==-1||s[i]==s[j])            next[++i]=++j;        else             j=next[j];}
//NEXT数组,优化版void getnext(char *s){    int next[81]={-1,0};    int i=0,j=-1,l=strlen(s);    while(i<l)        if(j==-1||s[i]==s[j]){            i++;            j++;            if(s[i]==s[j])                next[i]=next[j];            else                 next[i]=j;            //next[i]=s[i]==s[j]?next[j]:j;        }        else             j=next[j];}

未优化和优化版求出来的NEXT数组是不一样的,但仔细理解优化版,却发现很在理。
对于字符串“abcabcdf”

a b c a b c d f 未优化 -1 0 0 0 1 2 3 0 已优化 -1 0 0 -1 0 0 3 0

看一下字符串前面部分abca,未优化版会回到到第一个a的地方然后再去与第一个a比较一下,何必呢?本来就是因为该位置不等于a才引起的回退,所以优化版直接回退到第一个a对应的next数组值。
表述起来还是比较难的,还是看代码最直接明了。

利用next数字进行匹配

bool KMP(char *pStr, char *pSubStr, int *next){    //此处主要是为了讲KMP,不对非法参数做处理    int i=0;    int j=0;    int len1 = strlen(pStr);    int len2 = strlen(pSubStr);    while(i<len1 && j<len2)        if(j==-1 || pStr[i]==pSubStr[j])            ++i,++j;        else            j = next[j];    if(j==len2)        return true;    return false;}

看代码吧,清晰明了,没啥好解释。

0 0
原创粉丝点击