1. 程式人生 > 實用技巧 >字串匹配——KMP

字串匹配——KMP

KMP
暴力演算法:
S:較長的串,p較小的串,需要在S中查詢的串

for(int i=1;i<=n;i++){//從s[i]開始匹配p 
  bool flag=true;
  for(int j=1;j<=m;j++)
    if(s[i+j-1]!=p[j]){
      flag=false;
      break;
     } 
  }

next[i]:表示以i為終點的字尾和從1開始的字首相等,並且字尾的長度最長
next[i]=j:表示p[1,j]=p[i-j+1,i]

KMP匹配過程

for(int i=1,j=0;i<=m;i++){//字串s,p都是從1開始 
  while(j&&s[i]!=p[j+1]) j=ne[j];//當下一個位置不相等時,j就往前退,也就是p整體右移;j=0表示退無可退   if(s[i]==p[j+1]) j++;   if(j==n){     //匹配成功   } }

求next

ne[1]=0;
for(int i=2,j=0;i<=n;i++){
  while(j&&p[i]!=p[j+1]) j=ne[j];
  if(p[i]==p[j+1]) j++;
  ne[i]=j;
}

注:這裡的程式碼都是從1開始,也就是cin>>p+1>>s+1;

寫於:2020/9/12 15:58