提示:可搭配B站比特大博哥视频学习:传送门 (点击)
前言
BF算法,即暴力(Brute Force)算法,是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较s的第王个字符和T的第二个字符; 若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果。BF算法是一种蛮力算法。
——来自百度解释
简单点来说,就是有一个字符串比如:"ababcabcdabcde"作为主串,"abcd"作为子串,现在在主串中查抄子串,如果找到了就返回主串对应起始下标,如果没有找到就返回-1。
一、图解BF
(1)建立两个字符串,不难看出当i指向5时,从5开始到9所对应的字符串就是子串对应的字符串.
(2)首先将i和j一一对应,当发现i指向2下标对应的字符时时,与j指向2下标对应的字符不相等,所以先将i = i - j + 1,再将j = 0,于是i就从下标1开始而就从下标0开始 。
(3)而当匹配到合适的字符时,则返回i - j作为下标
(4)若超出主串长度有没有合适的字符串时,则返回-1.
二、上代码【C】
1.BF部分
//const常规操作了,防止数据被篡改
const int BF(const char* str, const char* sub)
{
//断言及时制止崩溃的程序
assert(str != NULL && sub != NULL);
//如果输入为空则返回-1
if (str == NULL || sub == NULL)
{
return -1;
}
//计算两个字符串的长度
int Strlen = strlen(str);
int Sublen = strlen(sub);
//定义i为主串的指针,j为字串的指针,下标从0开始
int i = 0;
int j = 0;
//当i和j都没有超出字符串的长度时
while (i < Strlen && j < Sublen)
{
//开始匹配
if (str[i] == sub[j])
{
i++;
j++;
}
//匹配不成功则将i移动到下一位继续匹配,j归零
else
{
i = i - j + 1;
j = 0;
}
}
//匹配到合适的字符串时
if (j >= Sublen)
{
//直接返回合适字符串的下标
return i - j;
}
//没有找到合适字符串时返回-1
return -1;
}
2.读入数据
int main ()
{
printf("%d\n", BF("absjdabcdeaa", "abcde"));//对应输出5
printf("%d\n", BF("absjdabcddaa", "abcde"));//对应输出-1
printf("%d\n", BF("absjdabcdeaa", "ab")); //对应输出0
return 0;
}
总结
1.BF是暴力算法,理解起来比较简单,但是效率比较低,时间复杂度O(M*N)
2.下面一篇文章有关KMP也是字符匹配算法,是面试中经常容易考到的,并且效率比较高
3.建议先学习BF,有助于理解KMP