【数据结构与算法】BF算法

本文介绍了BF算法,一种用于串的模式匹配的经典算法。BF算法主要用于搜索引擎、拼写检查和语言翻译等领域。它通过逐个比较主串和模式串的字符来寻找匹配子串,时间复杂度在最坏情况下为O(n*m)。文章详细阐述了算法的设计思想,并通过过程演示和代码实现帮助理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

串的模式匹配算法

算法目的:确定主串中所含子串第一次出现的位置

算法应用:搜索引擎、拼写检查、语言翻译等

算法种类:BF算法(Brute-Force,特点:古典、景点、朴素、穷举)

​ KMP算法(特点:速度快)

BF算法介绍:

​ 在主串中查找与模式T(副串)相匹配的子串,如果匹配成功,返回子串在主串出现的第一个字符的位置。

​ 不一定非要从第一个元素开始。可以指定在主串中的起始位置。

BF算法设计思想:

Index(S,T,pos)

  • 将主串第pos个字符和模式串的第一个字符比较
    • 若相等,继续逐个比较后续字符串
    • 若不相等,从主串的下一个字符起,重新与模式串的第一个字符比较
  • 直到主串的一个连续字符串序列与模式串相等。返回S与T匹配子序列第一个字符的序号,即匹配成功
  • 否则,匹配失败,返回值0

过程演示:

主串:aaaaab

模式串:aaab

匹配过程描述:数组存储字符串,从第一个字符开始,下标为0。使用S[i]获取主串字符,使用T[j]获取模式串字符。

如果S[i]==j[i],++i,++j;

如果S[i]!=j[i],i返回为起始值加一,j重置为0。

  • 第一趟匹配
i=0
a a a a a b
a a a b
j=0
//当i=3 j=3时 S[i]=a J[i]=b不匹配,i=(i-j+1)=(3-3+1)=1 
								 j=0
  • 第二趟匹配
  i=1
a a a a a b
  a a a b
  j=0
//当i=4 j=3时 S[i]=a J[i]=b不匹配,i=(i-j+1)=(4-3+1)=2 
								 j=0
  • 第三趟匹配
    i=2
a a a a a b
    a a a b
    j=0
//当i=5 j=3时,匹配成功,返回(i-T.length)

代码实现:

public int IndexOfBF(String S,String T,int pos){
	char []a = S.toCharArray();
	char []b = T.toCharArray();
	int i=pos;int j=0;
	while(i<S.length() && j<T.length()){
		if(a[i]==b[j]){	//	比较每个字符,都匹配
			i++;
            j++;//比较下一位
		}
		else{	//有不匹配的字符
            
			i=i-j+1;//i赋值为当前值的下一位
            j=0;//j重头开始
		}
	}
    if(j>=T.length()){//匹配成功(参考第三趟匹配成功时,j为4,T.length也是4)
		return i-T.length();
    } 
    else{
        //匹配失败
		return 0;
    }	

时间复杂度:

若n为主串长度,m为子串长度,最坏的情况是

  • 主串前n-m个位置都匹配到了子串的最后一位,即这n-m位各比较了m次。
  • 最后m位各比较了1次
    总次数为:(n-m)*m+m=(n-m+1)*m

若m<<n 则算法复杂度O(n*m)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值