关于kmp模板

那个求p串的next数组 这个版本是下标从1开始的字符串,如果从0开始的话,可以在前面加空字符,然后p.size或者s.size的地方-1即可。

nex[1]=0      

for(int i=2,j=0;i<=p.size();i++)

{  

  while(j&&p[i]!=p[j+1])j=nex[j];

  if(p[i]==p[j+1])j++;

  nex[i]=j;

}

 

kmp函数

for(int i=1,j=0;i<=s.size();i++)

{

  while(j&&s[i]!=p[j+1])j=nex[j];

  if(s[i]==p[j+1])j++;

  if(j==p.size())

  {  

    那么此时在s串中模式串p的起始下标就是i-p.size()+1.

    返回即可。

  }  

}


据此修改的下标为0开始的代码

  1. #include<iostream>  
  2. using namespace std;  
  3. string s,p;  
  4. int next1[100];  
  5. void nex(){  
  6.     next1[0]=-1;  //
  7.     for(int i=1,j=-1;i<p.size();i++){  //
  8.         while (j!=-1&&p[i]!=p[j+1])  //
  9.         {  
  10.             j=next1[j];  
  11.         }  
  12.         if(p[i]==p[j+1])j++;  
  13.         next1[i]=j;  
  14.     }  
  15. }  
  16. int main(void){  
  17.     cin>>s>>p;  
  18.     nex();  
  19.     for(int i=1,j=-1;i<s.size();i++){  //
  20.         while (j!=-1&&s[i]!=p[j+1])  
  21.         {  
  22.             j=next1[j];  
  23.         }  
  24.         if(s[i]==p[j+1])j++;  
  25.         if(j==p.size()-1){  
  26.             cout<<i-p.size()+1;  //
  27.             break;  
  28.         }  
  29.     }  
  30.     return 0;  
  31. }  
posted @ 2023-12-04 19:46  泥薯  阅读(32)  评论(0)    收藏  举报