KMP算法

今天终于基本掌握了kmp(想在网上找好的学习资源真的不容易)

假如我们有一个字符串S和模板串P,我们想在S中找到和P一模一样的子串,这不难,我们直接暴力遍历即可,但这样做的时间复杂度是O(nm),所以为了优化这个问题,kmp就体现了它的优越性.

这里我推荐去看一个印度小哥讲解的视频,直接一点即通:https://www.bilibili.com/video/av3246487/?spm_id_from=333.788.videocard.1

这里我再贴上我所认为的最简单的代码,其关键是找next数组(只对模板串进行分析,找到每个位置的相同前后缀)!

#include 
#include 
#include 
#include <string.h>
#include 
#include 
#include 
#include 
#include 
#include 
#include <set>
#define ll long long
const int N=1e6+10;
using namespace std;
typedef pair<int,int>PII;
int n,m;
char s[N],p[N];
int ne[N];
int main(){
    cin>>s+1>>p+1;             //下标从一开始
    n=strlen(s+1);  m=strlen(p+1);
    memset(ne,0,N);  

      //求next数组
       for(int i=2,j=0;i<=m;i++){
          while(j!=0 && p[i]!=p[j+1]) j=ne[j];
       if(p[i]==p[j+1])  j++;
         ne[i]=j;
       }

       //s与p进行匹配
        for(int i=1,j=0;i<=n;i++){
       while(j!=0 && s[i]!=p[j+1]) j=ne[j];
             if(s[i]==p[j+1])  j++;
               if(j==m){
                   cout<1<//下标从1开始
           j=ne[j];  //继续向后查找
           }           
    }
  return 0;
}

 

你可能感兴趣的:(KMP算法)