您的位置:首页 > 编程语言 > C语言/C++

查找字符串之 BF算法

2014-08-03 18:25 162 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c++ 字符串查找