KMP 复习

发布时间:2019年08月28日 阅读:299 次

KMP 算法 复习
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
char a[2000000],b[2000000];
int Next[2000000];
void get_next(){

    Next[0] = 0;
    int len = strlen(b);
     int j = 0;
    for(int i=1;i<len;i++){

        j = Next[i-1]; //重点
        while(j>0&&b[i]!=b[j])j = Next[j-1];
        if(b[i]==b[j])Next[i] = j+1; //重点
        else Next[i]  = 0;
    }

}
int kmp(){

//    Next[0] = -1;
    int len1 =  strlen(a);
    int len2 = strlen(b);
    int j = 0;
    for(int i=0;i<len1;i++){
       while(j>0&&a[i]!=b[j])j = Next[j-1];
       if(a[i]==b[j]){
        // i++;  //重点
         j++;
       }
       if(j==len2){
         return i-len2+1;
       }
    }
    return -1;
}
int main()
{

    while(cin>>a){
            cin>>b;
       get_next();
       int ans = kmp();
       if(ans==-1){
          cout<<ans<<endl;
       }
       else {
          cout<<ans+1<<endl;
       }
    }
    return 0;
}


Tag:
相关文章

发表评论: