BF算法,即暴风(Brute Force)算法,是普通的模式匹配算法,BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,若相等,则继续比较S的第二个字符和 T的第二个字符;若不相等,则比较S的第二个字符和T的第一个字符,依次比较下去,直到得出最后的匹配结果。BF算法是一种蛮力算法。
这里我们来详细讲一下 算法的核心思想
1.从主串第一个字符开始匹配
2.如果找到匹配的 ——》 继续逐个寻找后面是否与子串匹配 ——》全部匹配 指针调回第一个位置(指针回溯) 返回匹配的位置
3.始终未找到匹配的 ——》 返回未找到的标识
但是我们想过是否指向子串的指针j 与 指向主串的指针i 是否始终存在一种对应关系?
因此可以简化搜索代码
int i = pos , j = 1; //i为开始寻找的位置
while(i <= sLen && j <= tLen)
if(sLen[i] == tLen[j]){
i++;
j++;
}
else{
i = i + j - 2; //指针回溯到主串的下一个位置
j = 2;
}
if(j > tLen)//未搜索到
return i - tLen;
return 0;
}
下面我们使用BF算法匹配并且对比之前的匹配算法
之前算法
}
// 寻找从pos开始子串在父串中的位置 返回位置
int Index_HeapString(HString * parent , HString * child , int pos)
{
if(pos < 0) return ERROR;
HString * substr = (HString * )malloc(sizeof(HString)); //在父串中截取
InitString_Heap(substr);
int i = pos;
while(i + child->length - 1 <= parent->length){
//在父串中截取
SubString_HeapString(substr , parent , i , child->length);
if(StrCompare_HeapString(substr , child) != EQ){
i++;
}
else{
return i;
}
}
free(substr);
return 0;
}
BF算法
//暴风算法实现返回子串在主串的位置
int BFCompare(HString * parent,HString * child,int pos)
{
int i = pos;
int j = 1;
while(i <= parent->length && j <= child->length){
if(parent->ch[i - 1] == child->ch[j - 1])
{
i++;
j++;
}
else
{
i = i - j + 2;
j = 1;
}
}
if(j > child->length)
{
return i - child->length;
}
return 0;
}