10.13总结------kmp算法

自周四之后这两天,没怎么系统的看,今天周六把作业,等等琐事处理完了,明天一天没有别的事,会系统的看看知识点。

今天把kmp算法看了一看,现在终于明白了:

#include<iostream>
#include<bits/stdc++.h>
using namespace std;
char a[1007],b[1007];
int p[1007],n,m;
void pre()// 预处理相当于b串,从1到b的长度,找前缀等于后缀的最长长度。
{
    p[1]=0;
    int j=0;
    for(int i=1;i<m;i++)
    {
        while(j>0&&b[j+1]!=b[i+1])j=p[j];
        if(b[i+1]==b[j+1])j++;
        p[i+1]=j;
    }
}
    /*int kmp()
    {
        int ans=0;
        int j=0;
        for(int i=0;i<n;i++)
        {
           while(j>0&&b[j+1]!=a[i+1])j=p[j];
        if(b[j+1]==a[i+1])j++;
       if(j==m)
       {
           ans++;
           j=0;
       }
        }
        return ans;
    }*/
    void kmp()
    {
        int j=0;
        for(int i=0;i<n;i++)
        {
            while(j>0&&b[j+1]!=a[i+1])j=p[j];
            if(b[j+1]==a[i+1])j++;
            if(j==m)
            {
                cout<<i+1-m+1<<endl;
                j=p[j];
            }
        }
    }
int main()
{
    while(cin>>a+1)
    {
        if(a[1]=='#')break;
        cin>>b+1;
        m=strlen(b+1);
        n=strlen(a+1);
        pre();
        //cout<<kmp()<<endl;
        kmp();
    }
}

具体请看大佬写的:

https://blog.csdn.net/starstar1992/article/details/54913261/

如果你看不懂KMP算法,一定要看看这个视频!!!!!!!!!!!虽然讲的慢,但是很详细!!!!

上:http://v.youku.com/v_show/id_XODYxNjExODQ=.html     第 34分钟开始 

下:http://www.56.com/u28/v_NjAwMzA0ODA.html     
 

猜你喜欢

转载自blog.csdn.net/qq_40859951/article/details/83043480