【字符串匹配】BF算法

目录

前言

一、算法逻辑

二、代码实现

总结


前言

BF算法,即暴力(Brute Force)算法,是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符;若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果。BF算法是一种蛮力算法。

bf算法进行字符串完全的遍历,所以其的时间复杂度较大,为(O(n * m)),但逻辑简单,代码实现方便。


一、算法逻辑

主串和子串从开头位置开始一一比较,如果二者相等,则接着比较下一个,如果不相等,那么子串回到开头位置,主串回到上次开头的下一个位置,再次进行比较。直到匹配成功,或者主串遍历完成。

二、代码实现

将上述逻辑进行代码转换:
使用i, j两个数组下标指示器,分别指向主串和子串的开头,然后一一比较。

如果两者相等,i++,j++接着比较下一个;

如果二者不相等,j = 0, i 也应该回退, i = i - j + 1(i回退到这一趟匹配的开始位置,再+1 即可);

如果 i 走出了范围,j 却没走出, 代表主串中不存在子串;

如果 j 走出了范围,代表找到了, return i - j;

#include <stdio.h>
#include <assert.h>
#include <string.h>
#include <stdlib.h>

int BF_Search(const char* str, const char* sub, int pos)//pos代表主串从pos这个位置开始向后找
{
	assert(str != NULL && sub != NULL);
	if (pos < 0 || pos >= strlen(str))
	{
		return -1;
	}

	int len_str = strlen(str);//主串长度信息
	int len_sub = strlen(sub);//子串长度信息
	int i = pos;//主串的开始位置
	int j = 0;//子串你的开始位置

	while (i < len_str && j < len_sub)
	{
		if (str[i] == sub[j])//如果相等,则同时向后走一步,i++,j++
		{
			i++;
			j++;
		}
		else//如果不相等,则j回退到0,而i回退到这一趟匹配的开始位置,再+1
		{
			i = i - j + 1; //易错点,i和j的回退顺序不要反
			j = 0;
		}
	}
	//while循环退出,代表着i要么走出去了,要么j走出去了
	//这里只需要判断j,如果循环退出了,j也走出sub的范围了,则代表找到了,如果j没有走出范围,代表没找到
	if (j >= len_sub)//如果j走出sub的范围,则代表找到了,返回这一趟成功匹配的开始位置 i-j
	{
		return i - j;
	}
	else
	{
		return -1;
	}
}

总结

以上就是bf算法相关的内容,本文介绍了bf算法的逻辑和使用方法,并对其进行了实现,bf算法为经典暴力求解的例子,但其逻辑简单,在日常使用不需要特别时间精度时,也不失为一种优秀的解决办法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值