#include<cstdio> #include<cmath> #include<cstring> #include<iostream> #include<cstdlib> #include<algorithm> #include<string> #include<stack> #include<queue> #include<map> #include<stdio.h> #include<stdlib.h> #include<iostream> #include<string> #include<cstdlib> using namespace std; int nextVal[1000]; //next数组就是子串s[0...i]的 //最长相等前后缀的前缀最后一位的下标 //nextVal:当模式串的i+1位发生失配时,i应该回退到的最佳位置 void getNextval(char s[],int len){ int j=-1; nextVal[0]=-1;//没有即为-1 for(int i=1;i<len;i++){ while(j!=-1&&s[i]!=s[j+1]){ j=nextVal[j]; } if(s[i]==s[j+1]){ j++; } if(j==-1||s[i+1]!=s[j+1]){ nextVal[i]=j; }else{ nextVal[i]=nextVal[j]; } } } //text文本串,pattern模式串 int KMP(char text[],char pattern[]){ int text_len=strlen(text); int pa_len=strlen(pattern); getNextval(pattern,pa_len); int ans=0,j=-1; for(int i=0;i<text_len;i++){ while(j!=-1&&text[i]!=pattern[j+1]){ j=nextVal[j]; } if(text[i]==pattern[j+1]){ j++; } //pattern完全匹配,说明pattern是text子串 if(j==pa_len-1){ ans++;//成功匹配次数+1 j=nextVal[j]; } } return ans; } int main(){ char text[10]="abababab"; char pattern[10]="ababa"; int ans=KMP(text,pattern); cout<<ans<<endl; return 0; }
KMP算法及实现
猜你喜欢
转载自www.cnblogs.com/anhuixuyin218/p/8906219.html
今日推荐
周排行