<pre name="code" class="cpp">/*
这是对失配函数没有优化的MP算法,最坏情况下也能达到O(m + n)的复杂度,
其中m为模板串长度,n为文本串长度.
此算法还可以计算模板串在文本中出现的次数(可重叠)
*/
char s[maxn],t[maxn];//s为文本,t为模板
int f[maxn];//失配函数
void getFail(char *P,int *f){//注意适配函数是对模板进行处理
int m = strlen(P);
f[0] = 0,f[1] = 0;
for(int i = 1;i < m;i++){
int j = f[i];
while(j && P[i] != P[j])j = f[j];
f[i + 1] = P[i] == P[j] ? j + 1 : 0;
}
}
int find(char *T,char *P,int *f){//其中T为文本,P为模板,在T中找P的第一次出现的位置。
int n = strlen(T),m = strlen(P);
getFail(P,f);//初始化失配函数
int j = 0;
for(int i = 0;i < n;i++){
while(j && P[j] != T[i])j = f[j];
if(P[j] == T[i])j++;
if(j == m){
return i - m + 1;//匹配上的位置
/*
若要知道模板在文本中出现的次数,可以这样写
ans++;//其中ans为出现次数
j = f[j]//如果计算重叠的就这样写,例如aaaa, aa ,那么出现的地方为0,1,2
j = 0;//如果计算不重叠的就这样写,例如aaaa, aa,那么出现的地方为0,2
*/
}
}
}
KMP算法
最新推荐文章于 2024-11-16 09:45:51 发布