裸的KMP实现

来源:互联网 发布:博雅软件怎么用 编辑:程序博客网 时间:2024/05/16 03:18
int strStr(string haystack, string needle) {


    if(!haystack.size()&&!needle.size())
        return 0;
    else if(!needle.size())
        return 0;
    int len1=haystack.size();
    int len2=needle.size();
    int next[len2];
    //
    next[0]=-1;
    if(1<len2)
        next[1]=0;
    int i=2;
    int j=0;
    int len=needle.size();
    while(i<len)
    {
        if(j==-1)
        {
            next[i]=0;
            j=0;
            i++;
        }
        else if(needle[i-1]==needle[j])
        {
            next[i]=j+1;
            i++;
            j++;
        }
        else
        {
            j=next[j];
        }
    }
    //
    i=0;
    j=0;
    while(i<len1)
    {
        if(j==-1||haystack[i]==needle[j])
        {
            i++;
            j++;
        }
        else
        {
            j=next[j];
        }
        if(j==len2)
            return i-j;
    }
    return -1;
}
};