KMP 模板
//求子模板串的模式值f[n]的函数
//f[i]表示以i为下标的字符前边有几个跟开头重复的字符
void getFail(char *p, int *f)
{
int m=strlen(p);
f[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]?1+j:0;
}
}
//查找是否匹配函数
bool find(char *T,char *p,int *f)//传入的三个参数分别是主字符串,要比较的子模板串,子模板串的模式值数组
{
getFail(p,f);
int n=strlen(T);
int m=strlen(p);
int j=0;
for(int i=0; i<n; ++i)//循环主串中的字符
{
//如果出现字符不匹配,没必要从头循环,只需要从模式值f[j]查找
while(j && T[i]!=p[j])j=f[j];
if(T[i]==p[j])++j;
if(j==m)//当j==m时,表示找到匹配的字符串
{
return true;
}
}
return false;
}