串 朴素算法跟 KMP 算法

//  http://www.cnblogs.com/c-cloud/p/3224788.html
#include <iostream>
#include <cstring>
using namespace std;
void makeNext(const char* dest, int next[])
{
    int m =strlen(dest);
    int p,k;
    next[0]=0;
    for(p=1,k=0; p<m; p++)
    {
        while(k>0 && dest[p] != dest[k])
        {
            k= next[k-1];
        }
        if(dest[p]==dest[k])
        {
            k++;
        }
        next[p]=k;
    }
}
int  MyKMP(const char* dest, const char* src, int next[])
{//从第一位开始计数
    makeNext(src, next);
    int  lenSrc=strlen(src);
    int lenDest = strlen(dest);
    for(int i=0, q=0; i<lenDest;i++)
    {
        while(q>0 && src[i]!=dest[q])
        {
            q=next[q-1];
        }
        if(src[i]==dest[q])
        {
            q++;
        }
        if(lenSrc == q)
        {
            cout<<"the position is:"<<(i-lenSrc+1)<<endl;
        }
    }
}
int stupidKMP(const char *dest, const char* src)
{ //从第零位开始计数
    int i=0;
    int j=0;
    while(dest[i+j]&&src[j])
    {
        if(dest[i+j]==src[j])
        {
            j++;
        }
        else
        {
            i++;
            j=0;
        }
    }
    if(src[j]=='')
    {
        return i;
    }
    else
    {
        return -1;
    }
}
int main()
{
    int i;
    char dest[] = "BBC ABCDAB ABCDABCDABDE";
    char src[] = "ABCDABD";
    int size = strlen(src);
    int next[15]={0};
    cout<<dest<<endl;
    cout<<src<<endl;
    cout<<stupidKMP(dest,src)+1<<endl; //stupid KMP
    MyKMP(dest,src,next); //KMP
    for (i = 0; i < strlen(src); ++i)
    {
        cout<<next[i];
    }
    cout<<endl;
    return 0;
}
关注公众号 海量干货等你
原文地址:https://www.cnblogs.com/sowhat1412/p/12734515.html