C实现BF算法
BF算法是什么
通俗的讲,BF算法就是暴力求解,通过一个个遍历来达到匹配字符串的目的。因此可以看出,BF算法的效率并不高,最好的情况下的时间复杂度为O(n),最坏的情况为O(n*m)。这里的BF算法是为了更好的理解KMP算法。
BF算法的实现逻辑
我们通过图来演示BF算法是如何实现的:
此处B为主串,A为子串,要想在B主串中找到与A子串相同的字符串,BF算法的逻辑是从A子串的第一个元素开始比对,若配对成功则主串与子串同时+1,比对后面的元素,依此类推。那么如果在某一处有元素不同,就像上图的下标为2的位置上,B主串元素为a,A子串元素为c,BF算法的处理方式是(对应下图):将子串往右移,使子串的第一个元素与主串的上一次比较过的元素的第一个元素的后一个元素进行比较(为了便于理解可以认为,相当于将主串的前一个元素删去,主串变成了b为首元素的字符串),一次次遍历直到找到有相匹配的字符串,便返回主串中与子串相同的字符串的首元素下标。
BF算法的代码实现逻辑
在代码中查看实现逻辑
BF算法代码
#include<stdio.h>
#include<assert.h>
int BF(const char* B, const char* A)
{
//断言两字符串不为NULL
assert(B && A);
//i用来控制主串,j用来控制子串,ret用来记录若有完整的匹配的字符串时,该字符串的起始位置
int i = 0, j = 0; int ret = i;
//当主串和子串都不为'\0'时,进入循环进行比对
while (*(B+i) && *(A+j))
{
//如果对应元素相同,则往后走
if (*(B+i) == *(A+j))
{
i++;
j++;
}
//不同,则让i回到主串的上一次比较过的元素的第一个元素的后一元素,j赋为0,子串重新比对,
//ret则等于新的起始位置
else
{
i = i - j + 1;
j = 0;
ret = i;
}
}
//若主串对应的元素为0,则代表遍历完成,主串没有与子串相匹配的字符串,
if (*B == '\0')
{
return -1;
}
//if如果不执行,下面这个return便会执行。返回下标。
return ret;
}
int main()
{
//首先创建两个字符串
char arr1[] = "abcabcdabcde";
char arr2[] = "abcd";
//将字符串传入实现BF算法的函数中
int ret = BF(arr1, arr2);
//接收返回值得到结果
if (ret == -1)
{
printf("匹配失败,主串中不含模式串\n");
}
else
{
printf("匹配成功,主串中定义到模式串的位置为:%d", ret);
}
return 0;
}
小结
BF算法是一种低效的算法,学习这种算法的意义笔者认为只是为了更好的理解KMP算法,对于KMP算法的讲解,在3天内会发出。