点个赞和收藏呗,蟹蟹~(๑•̀ㅂ•́)و✧
正文开始:
--------------------------------------------(分割线)-------------------------------------------
以下是BF算法在C++中实现的代码
#include <bits/stdc++.h>
#include <cmath>
#include <stdio.h>
using namespace std;
#define N 10005
char *bruteForce(char text[ ], char pat[ ]);
char a[N], b[N];
int main() {
char *pos;
cin >> a >> b;
pos = bruteForce(a, b);
if (pos == nullptr) {
cout << "No" << endl;
} else {
cout << pos - a << endl;
}
return 0;
}
char *bruteForce(char text[ ], char pat[ ]) {
int lent = strlen(text), lenp = strlen(pat);
int pi = 0, pj = 0;
if (lent == 0 || lenp == 0 || lent < lenp) {
return nullptr;
}
while (pi <= lent - lenp && pj < lenp) {
if (text[pi + pj] == pat[pj]) {
pj++;
} else {
pi++, pj = 0;
}
}
if (pj == lenp) {
return text + pi;
}
return nullptr;
}
以下是解析(看不懂的来):
这段代码实现了经典的暴力字符串匹配算法
头文件和宏定义(这个应该都会吧awa)
#include <bits/stdc++.h>
#include <cmath>
#include <stdio.h>
using namespace std;
#define N 10005
#include <bits/stdc++.h>
:这是一个包含几乎所有C++标准库头文件的预处理指令。#include <cmath>
和#include <stdio.h>
:分别用于数学函数和C风格输入输出。using namespace std;
:使用标准命名空间,避免每次调用标准库函数时都要加上std::
前缀。#define N 10005
:定义一个常量N
,值为10005,用于数组的最大长度。
全局变量声明
char *bruteForce(char text[], char pat[]);
char a[N], b[N];
char *bruteForce(char text[], char pat[]);
:声明了一个名为bruteForce
的函数原型,该函数接受两个字符数组(文本和模式),返回指向匹配位置的指针。char a[N], b[N];
:声明了两个全局字符数组a
和b
,每个数组最多可以存储10004个字符(最后一个字符留给空终止符\0
)。
主函数
int main() {
char *pos;
cin >> a >> b;
pos = bruteForce(a, b);
if (pos == nullptr) {
cout << "No" << endl;
} else {
cout << pos - a << endl;
}
return 0;
}
char *pos;
:声明一个指向字符的指针pos
,用于存储匹配结果的位置。cin >> a >> b;
:从标准输入读取两个字符串,分别存储在a
和b
中。pos = bruteForce(a, b);
:调用bruteForce
函数,在text
中查找pattern
,并将结果存储在pos
中。if (pos == nullptr)
:如果pos
为空指针,表示没有找到匹配项,输出"No"。else
:否则,计算并输出匹配项在text
中的起始索引(即pos - a
)。-
暴力搜索函数
char *bruteForce(char text[], char pat[]) { int lent = strlen(text), lenp = strlen(pat); int pi = 0, pj = 0; if (lent == 0 || lenp == 0 || lent < lenp) { return nullptr; } while (pi <= lent - lenp && pj < lenp) { if (text[pi + pj] == pat[pj]) { pj++; } else { pi++, pj = 0; } } if (pj == lenp) { return text + pi; } return nullptr; }
int lent = strlen(text), lenp = strlen(pat);
:获取文本和模式的长度。int pi = 0, pj = 0;
:初始化两个索引变量,pi
用于遍历文本,pj
用于遍历模式。if (lent == 0 || lenp == 0 || lent < lenp)
:检查特殊情况,如果文本或模式为空,或者模式比文本长,则返回空指针。while (pi <= lent - lenp && pj < lenp)
:遍历文本的所有可能的起始位置,进行逐字符比较。if (text[pi + pj] == pat[pj])
:如果当前字符匹配,继续比较下一个字符。else
:如果不匹配,将pi
移动到下一个位置,并重置pj
为0。
if (pj == lenp)
:如果pj
等于模式的长度,说明整个模式都匹配成功,返回匹配位置的指针。return nullptr;
:如果没有找到匹配项,返回空指针。
总结
这段代码通过暴力字符串匹配算法在一个文本字符串中查找另一个模式字符串的位置。它逐字符地比较文本和模式,直到找到完全匹配的子串或遍历完整个文本。虽然这种方法简单直接,但其时间复杂度较高,在最坏情况下为O((n-m+1)*m),其中n
是文本的长度,m
是模式的长度。
--------------------------------(分割线)--------------------------------------------------------
点赞·收藏·和关注!up制作不易😁