字符串匹配算法(BMP)(c++)

#include<iostream>

//BMP算法在主串和模式串匹配字符很多但又不完全匹配时,效率有明显提高
/*
	算法思路
	
	1.next数组的每个位置必须赋值

	2.BMP算法主要研究模式串

*/


void initNext(int next[])					//给next数组赋值
{
	int j = 0;

	char _arr[] = "ABABABBAA";                //目标模式串 -- 可以自行修改

	int len = sizeof(_arr);					//获取目标串长度
	
	next[0] = 0;							//首字符一定没有公共串 -- 置0

	for (int i = 1; i < len; i++)			
	{
		while (_arr[i] != _arr[j] && j > 0){j = next[j - 1];}	//当前字符不等且j>0时,没匹配上
																//j获得上一位置记录的公共串长,再同当前i对比

		if (_arr[i] == _arr[j]) { j++;}							//字符相等 -- j前进至下一位置

		next[i] = j;											//记录i位置的公共串长度
	}
}

	

void test(int next[])
{
	char _arr[] = "ABBBABABBABABABBABABABABBABABABABBABABABABBABBBBAABABBAAAAABABABBAABC";    //主串
	char child[] = "ABABABBAA";                      //模式串

	int L1 = sizeof(_arr) - 1, L2 = sizeof(child) - 1;                //记录两个串的最大下标

	int num = 0;            //记录匹配总次数

	int i = 0, j = 0;
	
	while (i < L1 && j < L2 )
	{
		num++;
		if (_arr[i] == child[j]) { i++; j++; }					//当前字符相等 匹配下一字符

		else if(_arr[i] != child[j] && j > 0) { j = next[j - 1]; }	//不相等回退至主串和模式串的最长公共串位置进行对比

		else { i++; }												//j == 0 且j位置元素与主串的当前元素不等 i前进一位置
	}
	std::cout <<"位置:" << i - j << std::endl;
	std::cout << "次数:" << num << std::endl;

}




int main()
{
	int next[10] = { 0 };
	
	initNext(next);

	test(next);

	//test();
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心若雪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值