前言
BF算法:
例如有下面两个数组 i (主串)和数组 j(模式串),他们的第0位置存放字符串的长度,第1个位置开始存放数据。要比较字符串j 是否存在于字符串i中:BF算法如下。
-
先将i[1] 与 j[1]的字符进行比较,比较ASCII码的大小,如果大小相同,则i和j都同时比较下一个位置i[2] 和 j[2]的字符,依次类推。
-
在比较到i[5]和j[5]的时候, 发现i[5]不等于j[5],那么就让数组i取第2个位置 (即i[2])和 j[1]开始从头比较,发现i[2] 和 j[1]也不同,就让i[3]和j[1]开始比较,依次类推。
-
若是过程中发现j的字符串存在于i中,则返回true; 若全部推完之后,没有发现j存在于i中,返回false;
比较之后,发现两个字符不匹配,再把主串位置移动到下一个位置,模式串的位置为0, 这种方式也叫“回溯”
代码:
#include <iostream>
#include <stdio.h>
using namespace std;
typedef struct
{
char* ch;
int length;
}str;
int BF(char S[], char T[])
{
int i = 0, j = 0;
int index = 0;
while ((S[i]!='\0')&&(T[j]!='\0'))
{
if (S[i] == T[j]) //匹配成功,i j都往后移动
{
++i;
++j;
}
else
{
//如果匹配不成功,主串和子串回溯坐标。 index记录的是每次匹配时的开始位置
++index;
i = index;
j = 0;
}
}
if (T[j] == '\0')//匹配成功,此时index+1刚好就是指向这轮比较在主串中的初始位置
{
return index + 1;
}
else
return 0;
}
int main()
{
char T[255]="nook";
char S[255]="nonokkknook";
int k;
k = BF(S, T);
cout << "模式串在主串的位置为:";
cout << k << endl;
}