个人理解的kmp算法

kmp还是挺难上手的,看书加看博客,看了有五六篇才理解,看了大概四个小时。。

#include 
#include 
#include 
using namespace std;

//next数组本质是模式串中的前缀和后缀的相等数
int next[555];

//得到next数组的过程也是模式串自身匹配的过程
void GetNext(char *p)
{
    int plen=strlen(p);
    //特判一种情况,第一位就对不齐的情况
    next[0]=-1;
    //k为前缀,j为后缀
    int k=-1;
    int j=0;
    while(j<plen-1)
    {
        //特判一种情况,第一位就对不齐的情况
        if(k==-1||p[j]==p[k])
        {
            k++;
            j++;
            //这里是优化next数组
            if(p[j]!=p[k])
            next[j]=k;
            else next[j]=next[k];
        }
        else
        {
            k=next[k];
        }
    }
}

int kmp(char *s,char *p)
{
    int i=0;
    int j=0;
    int sLen = strlen(s);
    int pLen = strlen(p);
    while(i<sLen && j < pLen)
    {
        if(j == -1 || s[i] == p[j])
        {
            i++;
            j++;
        }
        else//若是字符不匹配
        {
            //这里相当于将j减去一个j-next[j]
            //联想一下那个匹配的图,主串不动,模式串变化,即为模式串相当于主串滑动
            //即相当于模式串向右滑动了j-next[j]位
            
            //若不匹配则直接将模式串向右移动j-next[j]位。
            j = next[j];
        }
    }
    if(j == pLen)
        return i - j;
    else
        return -1;
}

int main()
{
    char a[555],b[555];
    cin>>a>>b;
    GetNext(b);
    int n=kmp(a,b);
    printf("%s",a+n);
    return 0;
}

你可能感兴趣的:(数据结构与算法)