字符串的模式匹配操作可以通过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;
}
执行结果如下: