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;

}

 

你可能感兴趣的:(KMP)