查找字符串之 BF算法

BF 算法最简单的查找查找字符串算法:

匹配串S同模式串P,逐个字节比较,失败后向后移动一个字节继续比较。直至成功或者比较结束。

形如  :--A A A A ----

比较1:--B B B B

比较2:--    B B B B ---

比较3:          B B B B --

..... 

这种方式简单粗暴如其名(Brute Force),但是效率较低,用在比较短的字符串查找,没有问题。

时间复杂度O(strlen(S)*strlen(P))

空间复杂度O(1)

以下代码山寨自vc strstr:

const char* strstr( const char* S , const char* P )
{
if ( !S || !P )
{
return NULL;
}
if ( !*P )
{
return S;// "" 匹配于任何字符串。
}
/*
if ( strlen(P) > strlen(S) )
{
return NULL;
}
*/
char *s = (char*)S;
char *s1,*s2;
while( *s )
{
s1 = s;
s2 = (char*)P;


while( *s1 && *s2 && !(*s1-*s2) )
s1++,s2++;
if ( !*s2 )
return s; //配置至模式串的最后,匹配成功.
//常规来说,这里应该判定 S + strlen(S) - s < strlen(P),剩余需要匹配的串已经小于模式串了就应该返回,
//可是vc的代码没有,我想应该是觉得调用strlen函数带来的开销,比把剩余的比较完带来的开销还大,或者说不好衡量。索性没有判定长度。
//事实上,BF算法的一个很重要的性质就是不需要知道串(匹配串,模式串)的长度,而其他基于跳跃的算法都是需要知道串的长度的.
s++; //匹配失败,向后移动一个字节继续比较。
}


return NULL;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值