码迷,mamicode.com
首页 > 编程语言 > 详细

KMP算法

时间:2015-08-08 11:40:22      阅读:106      评论:0      收藏:0      [点我收藏+]

标签:

2b青年的说法;先去匹配,如果失败,可能失败的前一部分长度的字符串的前缀和后缀相同,那就可以直接把前缀移到后缀那一块,省去了很多没用的时间。

关键就是求next数组。根据递归的思想;

next[0]=-1;

next[j]=k;p[0...k-1]=p[j-k...j-1];

1.如果p[j]==p[k],p[0...k]=p[j-k...j];next[j+1]=next[j]+1=k+1;

2.如果p[j]!=p[k],由于之前的都求了next[],所以直接移到,即匹配失败的时候,k=next[k]。

int kmp(char *s,char *p)
{
    int i,j,len=strlen(s);
    i=0;
    j=0;
    getnext(p);
    while(i<len)
    {
        if(j==-1||s[i]==p[j])
        {
            i++;
            j++;
        }
        else 
        {
            j=next[j];
        }
        if(j==strlen(p))
        {
            return i-strlen(p);
        }
    }
    return -1;
}//kmp匹配部分

void getnext(char *p)
{
    int k,j,len=strlen(p);
    next[0]=-1;
    j=0;
    k=-1;
    while(j<len-1)
    {
        if(k==-1||p[j]==p[k])
        {
            j++;
            k++;
            next[j]=k;
        }
        else k=next[k];
    }
}//递归思想求next

 

KMP算法

标签:

原文地址:http://www.cnblogs.com/sweat123/p/4712735.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!