BF算法(Brute Force)

BF算法详解
本文介绍了一种简单的字符串匹配算法——BF算法。通过两个循环对比模式串和目标串来实现逐个字符的匹配,若匹配失败则回溯到目标串的下一个位置继续尝试。适用于小规模数据的搜索场景。

算法思想:运用模式串和目标串进行逐个比较,当模式串匹配失败,则回溯到目标串的下一位,两个循环直到匹配成功或者跳出循环查找失败。

#include <iostream>
#include<cstring>
using namespace std;
#define MAXSIZE 250
typedef char STR[MAXSIZE + 1];

int assign(STR T, char *c)//T[0]用于存储位数,使串字符从数组第一位开始计起
{
if (strlen(c) > MAXSIZE) return 0;
else
{
T[0] = strlen(c);
for (int i = 1; i <= T[0]; ++i)
T[i] = *(c + i - 1);
return 1;
}
}

int BF(STR S, STR T,int pos)
{
int i = pos; int j = 1;
while (i <= S[0] && j <= T[0])
{
if (S[i] == T[j])
{
++i;
++j;
}//相同则继续匹配下一位
else
{
i = i - j + 2;
j = 1;
}//不相同则回溯
}
if (j > T[0]) return  i - T[0];//返回匹配位置
else return 0;

return 0;
}

int main()
{
STR S,T;
assign(S, "bbdcvaaabbaba" );
assign(T, "abba");
int flag;
flag=BF(S,T,1) ;
if(flag)
 cout << "匹配成功,在目标串的第" <<flag << "位数开始首次匹配!"<<endl;
else cout << "匹配失败,目标串中不存在该模式串!" << endl;
return 0;
}

时间复杂度为O(m*n),在一些数据量交少的地方可以用,但是一旦数据量达到一定量级,基本吃不动,这个时候就要去学习一下KMP算法了。

### Brute Force 模式匹配算法的原理与 C++ 实现 #### 算法原理 Brute ForceBF)模式匹配算法是一种简单的字符串匹配方法。其核心思想是通过逐一比较主串 `S` 和模式串 `P` 中的字符来查找匹配位置。具体来说,从主串的起始位置开始,取与模式串长度相同的子串进行逐字符比较[^3]。如果所有字符都匹配,则返回匹配的起始位置;否则,将主串中的比较起点右移一位,继续重复上述过程,直到找到匹配或遍历完整个主串[^1]。 #### 时间复杂度分析 在最坏情况下,BF 算法的时间复杂度为 \(O(n \times m)\),其中 \(n\) 是主串的长度,\(m\) 是模式串的长度。最坏情况发生在每次比较都需要检查到模式串的最后一个字符才确定不匹配时[^4]。然而,在平均情况下,BF 算法的表现通常优于最坏情况,尤其是当主串和模式串中字符分布较为随机时。 #### C++ 实现代码 以下是一个完整的 C++ 实现示例,展示了如何使用 BF 算法在主串中查找模式串的首次出现位置: ```cpp #include <iostream> #include <string> using namespace std; // Brute Force 模式匹配函数 int bruteForceMatch(const string& text, const string& pattern) { int n = text.size(); // 主串长度 int m = pattern.size(); // 模式串长度 // 遍历主串的所有可能起始位置 for (int i = 0; i <= n - m; i++) { int j; // 对每个起始位置,逐字符比较模式串和主串子串 for (j = 0; j < m; j++) { if (text[i + j] != pattern[j]) break; // 如果发现不匹配,跳出循环 } if (j == m) return i; // 如果成功匹配整个模式串,返回起始位置 } return -1; // 如果未找到匹配,返回 -1 } int main() { string text = "hello world"; // 主串 string pattern = "world"; // 模式串 // 调用 BF 匹配函数并输出结果 cout << "Brute Force: " << bruteForceMatch(text, pattern) << endl; return 0; } ``` #### 代码解释 - **输入参数**:函数 `bruteForceMatch` 接收两个字符串参数,分别是主串 `text` 和模式串 `pattern`。 - **外层循环**:外层循环控制主串中模式串的起始位置,范围是从 `0` 到 `n - m`(即主串中可以容纳模式串的最大起始位置[^2])。 - **内层循环**:内层循环负责逐字符比较模式串和主串的子串。如果发现不匹配的字符,则立即退出内层循环,并移动到下一个起始位置。 - **返回值**:如果找到匹配的子串,返回其在主串中的起始位置;否则返回 `-1` 表示未找到匹配[^1]。 --- #### 示例运行 假设主串为 `"abababc"`,模式串为 `"abc"`,则算法的执行过程如下: 1. 第一次比较:主串子串 `"aba"` 与模式串 `"abc"` 不匹配。 2. 第二次比较:主串子串 `"bab"` 与模式串 `"abc"` 不匹配。 3. 第三次比较:主串子串 `"abc"` 与模式串 `"abc"` 完全匹配,返回起始位置 `4`。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值