BF算法常用于串中的模式匹配,是一个很常见且使用的一种算法。本文将给大家讲述BF算法的C语言实现。
参照严蔚敏版的数据结构中有关BF算法中的不太好理解就是,在发生不匹配的情况下,主串返回的位置为:i-j+2。首先这个可以写成i-(j-1)+1,可以将其理解为:不匹配的主串位置减去字串匹配滑动的次数在加上一,这样一来主串接收到返回的位置即为起始匹配位置的下一个位置。也许这样说可能还是不太清楚大家可以试着画一个图,去模拟模式匹配的过程。这里还需要指明的是严版的数据结构在BF算法这里做了一个默认,即默认数组是从1开始而非从0开始。
下面是相关C语言实现的代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAXLEN 255
typedef struct
{
char str[MAXLEN];
int length;
}SSteing;
int BF(SSteing a,SSteing b,int pos);
int main (void)
{
int start = 0;
SSteing S,T;
printf("请输入主串:");
scanf("%s",S.str);
printf("请输入子串:");
scanf("%s",T.str);
S.length = strlen(S.str);
T.length = strlen(T.str);
if(BF(S,T,start))
{
printf("yes,起始位置为:%d\n",BF(S,T,start));
}
else
{
printf("no\n");
}
system("pause");
return 0;
}
int BF(SSteing a,SSteing b,int pos)
{
int i = pos;
int j = 0;
while (i <= (a.length-1) && j <= (b.length - 1))
{
if(b.str[j] == a.str[i])
{
j++;
i++;
}
else
{
i = i - j + 1;
j = 0;
}
}
if(j > (b.length - 1))
{
return (i - b.length + 1);
}
else
{
return 0;
}
}
这里我并没有采用数组从1开始而是从0开始,这样的话在匹配失败是返回的位置就要修改为:i-j+1;与书上的不同就在于字串滑动次数的不同,比如:从1位置移动到3位置滑动了(3-1)次,从0位置滑动到2位置滑动了(2-0)=2次。
如果您有什么见解和疑问欢迎私信我或者通过1308269670@qq.com与我联系。