BF算法是我感觉最简单的模式匹配的解法,说白了就是暴力吧!就是太耗时间了,一般不采取。
简单的功能实现函数:
int BF(char s[],char t[])
{
int lens=strlen(s);//计算字符串的长度,经测试size(),length()都不行
int lent=strlen(t);
int i=0,j=0;
while(i<lens&&j<lent)
{
if(s[i]==t[j])
{
i++;
j++;
}
else
{
i=i-j+1;//每次匹配i都是等于j的,这个公式就是实现了每次匹配不成功加1
j=0;//归0
}
}
if(j>=lent)
{
return i-j;//这个结果是从字符串0位开始的
}
else
{
return -1;
}
}
KMP算法:
关键是求得Next数组,实现代码如下:
void KMP(char t[],int next[])
{
int j,k;
next[0]=-1;
j=1;
while(t[j]!='\0')
{
k=next[j-1];
while((k!=-1)&&(t[k]!=t[j-1]))
{
k=next[k];
}
next[j]=++k;
j++;
}
}
匹配代码:
int KMP_pipei(int *next,char *s,char *t)
{
int i=0,j=0,k;
while(s[i]!='\0'&&t[j]!='\0')
{
if(j==-1||s[i]==t[j])
{
i++;
j++;
}
else
{
j=next[j];
}
}
if(t[j]=='\0')
{
return i-j;
}
else
{
return -1;
}
}