算法原理
BF(Brute Force)算法是字符串模式匹配中原理最简单,也是最直观的算法。基本思想是从源字符串S中查找目的字符串P,从S中的n个字符开始和P的第一个字符开始比较,若相等,则继续分别取S和P的下一个字符继续比较,一次类推,直到源字符串S中的某一连续串和P完全相等,则匹配成功。如果在匹配的过程中发现有不相等的情况,则需要回退至S字符串中的第n+1字符串开始,重新和目的字符串继续比较,如此循环。
举一个简单例子,在目的字符串S(sabcsoul)中查找P(soul),第一次比较: S中的第一个字符's' = P中的第一个字符's',则继续比较彼此的下一个字符,发现S中的'a'和P中的'o'不相等,则第一次比较结束。第二次比较:从S中的第二个字符开始重新和P字符串比较,发现'a'不等于's',则结束本次比较。第三次比较,..., 一次类推。
算法复杂度
O((n-m)m)
算法特点
原理简单、直观,但是效率很低。
算法C语言实现
#include
#include
int BF_StrFind(char SrcStr[], char DstStr[])
{
int SrcLen = 0;
int DstLen = 0;
int i = 0;
int j = 0;
int tmp = 0; /*记录从源字符串中比较的位置*/
/*check paramter*/
if ((NULL == SrcStr) || (NULL == DstStr))
{
return 0;
}
SrcLen = strlen(SrcStr);
DstLen = strlen(DstStr);
while (i < SrcLen && j < DstLen)
{
if (SrcStr[i] == DstStr[j])
{
i++;
j++;
}
else
{
tmp++;
i = tmp;
j = 0;
}
}
if (tmp >= SrcLen)
{
return 1;
}
else
{
return 0;
}
}
void main()
{
char *SrcStr = "soabcsoul";
char *DstStr = "soul";
int result = 0;
int len1 = strlen(SrcStr);
int len2 = strlen(DstStr);
printf("len1= %d, len2 = %d\n", len1, len2);
result = BF_StrFind(SrcStr, DstStr);
if (0 == result)
{
printf("Find the String:%s Success!\n", DstStr);
}
else
{
printf("The String:%s NOT EXIST!\n", DstStr);
}
}