Brute Force算法介绍及C++实现

字符串的模式匹配操作可以通过Brute Force算法来实现。字符串匹配操作即是查看S串(目标串或主串)中是否含有T串(模式串或子串),如果在主串中查找到了子串,则模式匹配成功,返回模式串中的第一个字符在主串中的位置;如果未找到,则模式匹配失败,返回-1。

Brute Force算法,即暴风算法,是简单的模式匹配算法,其思想是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和T的第二个字符;若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果。Brute Force算法简单,易于实现;进行了回溯,效率不高。KMP算法是Brute Force的一种改进算法。

以下是测试code:

#include <string>
#include <vector>
#include <opencv2/opencv.hpp>
#include "common.hpp"

// ============================ Brute Force ================================
typedef std::tuple<int, int> brute_force_result; // <status, pos>

int brute_force(const std::string& str, const std::string& sub, brute_force_result& result)
{
	std::get<0>(result) = -1;
	std::get<1>(result) = -1;

	int length_str = str.length(), length_sub = sub.length();

	if (length_str < length_sub) return 0;

	for (int i = 0; i < length_str - length_sub + 1; ++i) {
		int count{ 0 };

		for (int j = 0; j < length_sub; ++j) {
			const char& c1 = str.at(i + count);
			const char& c2 = sub.at(j);

			if (c1 == c2) ++count;
			else break;
		}

		if (count == length_sub) {
			std::get<0>(result) = 0;
			std::get<1>(result) = i;
		}
	}

	return 0;
}

int test_brute_force_string_match()
{
	const std::string str{ "abcdABCD EFaadfk32!@#34flasf dafe" };
	const std::vector<std::string> sub{ "abcde", "ABCD EF", "fe", "!@#", "asf dafe", "afea"};

	for (const auto& val : sub) {
		fbc::brute_force_result result;

		fbc::brute_force(str, val, result);

		fprintf(stdout, "string match result: status: %d, pos: %d\n",
			std::get<0>(result), std::get<1>(result));
	}

	return 0;
}
执行结果如下:


GitHub:  https://github.com/fengbingchun/NN_Test 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值