KMP算法解析

介绍一种高效的KMP算法:代码可以直接运行

#include <iostream>
#include <iomanip>
using namespace std;

void preKmp(char* s,int len,int* next)
{
    int i=0,j=-1;
    next[0]=-1;

    while(i<len)
    {
        while(j>-1 && s[i]!=s[j])
            j=next[j];
        i++;
        j++;

        if(s[i]==s[j])
            next[i]=next[j];
        else
            next[i]=j;
    }
}

int KMP(char*s,char* p)
{
    int sn=strlen(s);
    int sp=strlen(p);
    
    int* next=new int[sp];
    preKmp(p,sp,next);

    int i=0,j=0;
    while(i<sn)
    {
        while(j>-1 && s[i]!=p[j])
            j=next[j];
        i++;
        j++;
        
        if(j>=sp)
        {
            return i-j;
        }
    }
    return -1;
}


int main(int argc, char* argv[])
{
    char* p="abcdabceabcde";
    char* s="abcdabcdabceabcde";
    int pos=KMP(s,p);
    cout<<pos<<endl;
    return 0;
}

 

posted @ 2014-03-12 10:55  qiaozhe  阅读(112)  评论(0编辑  收藏  举报