0
点赞
收藏
分享

微信扫一扫

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

芒果六斤半 2022-05-04 阅读 59
c++
#include<iostream>

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

	2.匹配情况做什么

	3.不匹配情况做什么

*/


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

	char _arr[] = "ABABABBAA";

	int len = sizeof(_arr);					//获取字符串长度
	
	next[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位置的公共串长度
	}
}


//		ABABABBABABABABBAB		

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 条评论