串的模式匹配算法 – BF算法详解

一、BF算法原理

BF算法是一种蛮力算法,其实现过程没有任何技巧,就是简单粗暴地拿一个串同另一个串中的字符一一比对,得到最终结果。

算法目的:确定主串中所含子串第一次出现的位置,这里的子串也称为模式串。

设计思想:

(1)主串和模式串逐个字符进行比较

(2)当出现字符不匹配(失配)时,主串的比较位置重置为起始位置的下一个字符位置,模式串的比较位置重置为起始字符

回溯关系的确定:i = i - j + 1; //主串指针回溯到比较起始位置的下一个字符位置
关键字:循环比较

第一次回溯
因为i=j=0都是从0开始,因此逐一比较时下标相等。回溯下标需要使i=1


第二轮回溯经过第一次回溯,i的下标比j的下标大1,因此进行i=i-j+1=2,i指针又往前挪移一位

因此i-j是保留之前累积的i>j的差值,然后+1,利用循环便可以继续累加,达到指针不断向前移,回溯到比较起始位置的下一个字符位置的效果。

(3)匹配成功返回主串中匹配串的起始位置,否则返回错误代码

简单理解返回位置,此时i=5为结束匹配时主串指针所指下标,j=3,为子串最后位置元素下标即子串长度,+1便表示位置而不是下标。

二、时间复杂度

设主串长度为m,子串长度为n
该算法最理想的时间复杂度 O(n),n 表示子串的长度,即第一次匹配就成功。

BF 算法最坏情况的时间复杂度为 O(n×m),即两个串每次匹配,都必须匹配至子串的最末尾才能判断匹配失败,因此运行了 n×m 次字。

在对数据量大的串进行模式匹配时,算法的效率很低。因此BF 算法还可以改进,就是 KMP 算法,下次再写文章解释。

三、C++实现代码

int BF(const char* S, const char* T) 
{
	int i = 0, // i主串的起始下标
		j = 0; // j子串的起始下标
	while (i < strlen(S) && j < strlen(T)) 
	{
		if (S[i] == T[j]) 
		{
			i++;
			j++;
		}
		else 
		{
			i = i - j + 1;	//主串指针回溯到比较起始位置的下一个字符位置
			j = 0;			//子串回到起始字符
		}
	}

	//j=strlen(T),说明子串遍历完成,在主串中成功匹配
	if (j == strlen(T)) 
	{
		return i - strlen(T) + 1;
	}
	//跳过if运行到此,为i==strlen(B)的情况,说明已经遍历完主串,匹配失败
	return -1;
}

int main()
{
	int number = BF("aaaaabcaaaacac", "aaaac");
	cout << number;
	return 0;
}

如有不足之处,还望指正 1


  1. 如果对您有帮助可以点赞、收藏、关注,将会是我最大的动力 ↩︎

  • 9
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
BF算法(Brute-Force算法),也称为朴素匹配算法,是一种简单直观的字符匹配算法。它的基本思想是从主的第一个字符开始,依次与模式的每个字符进行比较,如果匹配成功,则继续比较下一个字符,否则主指针后移一位,重新开始匹配。这个过程类似于暴力破解密码的过程,因此也被称为暴力匹配算法。 下面是BF算法的C语言实现: ```c #include <stdio.h> #include <string.h> int BF(char* s, char* p) { int i = 0, j = 0; int s_len = strlen(s); int p_len = strlen(p); while (i < s_len && j < p_len) { if (s[i] == p[j]) { i++; j++; } else { i = i - j + 1; j = 0; } } if (j == p_len) { return i - j; } else { return -1; } } int main() { char s[] = "hello world"; char p[] = "world"; int pos = BF(s, p); if (pos != -1) { printf("匹配成功,位置为:%d\n", pos); } else { printf("匹配失败\n"); } return 0; } ``` 在上面的代码中,BF函数接受两个参数,分别是主s和模式p。在函数中,我们使用两个指针i和j分别指向主和模式的第一个字符,然后依次比较它们的字符是否相等。如果相等,则继续比较下一个字符,否则主指针后移一位,重新开始匹配。如果模式匹配成功,则返回匹配的位置,否则返回-1。 需要注意的是,BF算法的时间复杂度为O(m*n),其中m和n分别为主和模式的长度。因此,当主和模式的长度较大时,BF算法的效率会比较低。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值