【字符串】(Brute Force String Matching)(BF算法)

点个赞和收藏呗,蟹蟹~(๑•̀ㅂ•́)و✧

正文开始:

--------------------------------------------(分割线)-------------------------------------------

以下是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];:声明了两个全局字符数组ab,每个数组最多可以存储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;:从标准输入读取两个字符串,分别存储在ab中。
  • 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制作不易😁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

呱呱呱~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值