BF算法是模式匹配算法中最直观的算法。这里简单说一下实现代码。
首先是预定义:
#define MAXLEN 100
typedef struct{
char ch[MAXLEN + 1];
int length;
}SString;
BF算法代码:
int Index_BF(SString S, SString T, intpos)
{
int i, j;
i = pos;
j = 0;
while ((i <= (S.length - 1)) && (j <= (T.length -1)))
{
if (S.ch[i] == T.ch[j])
{
i++;
j++;
}
else
{
i = i - j + 1;
j = 0;
}
}
if (j > (T.length - 1))
return i - T.length + 1;
else
return 0;
}
先声明i,j。让i等于主串S中开始查找的位置pos,j等于0,让T从下标为0的元素开始对比。当两个串均未达到串尾时执行对比。如果S串中的ch[i]和T串种ch[j]相等时,对比下一个,即让i和j都增加1。如果不相等,让i=i-j+1(指针后退,回到开始对比的下一个元素),重新开始匹配。最后如果j大于T的长度减1的时候,返回开始对比时S首个元素的位置,无法对比成功则返回0。
加入main()测试:
int main(void)
{
SString s, t;
int n;
printf("输入s:");
scanf("%s", s.ch);
for (s.length = 0; s.ch[s.length] != '\0'; s.length++)
;
printf("输入t:");
scanf("%s", t.ch);
for (t.length = 0; t.ch[t.length] != '\0'; t.length++)
;
n = Index_BF(s, t, 0);
printf("匹配位置:%d\n", n);
return 0;
}