#include <iostream>
using namespace std;
/**
*目标串(主串):a b a b c d e f
*模式串(子串):a b c(长度为len)
*BF算法的思想:从目标串的第一字符开始,截取长度为len的串与模式串匹配,如果len个字符都匹配上了,表示找到模式串,如果有一个字符没匹配上,就重新截取一个串,再和模式串匹配
*1、模式串len长度为3
*2、在目标串中截取subStr =" a b a",与"a b c"没有匹配上,需要重新截取
3、重新截取的串为subStr =" b a b" ,没有匹配上,重新截取
4、重新截取的串味subSte =" a b c" ,与模式串完全匹配
在实际过程中不需要截取中subStr串来,它只是一种思想,只要在目标串中找对了"subStr"即可
*/
/**返回子串在主串中的位置*/
int BF(char parent[],char child[])
{
int i =0, j = 0;//i指向目标串(中的subStr),j指向模式串
int index = 0;//记录目标串中每次匹配开始的地方(每次截取subStr的位置,从头开始)
while(parent[i]!='\0'&&child[j]!='\0')
{
//subStr中的字符与目标串中的字符挨个比较
if(parent[i] == child[j])
{
i++;
j++;
}
//有一个字符不相等则说明上一个subStr没有完全匹配上,需要截取下一个subStr
else
{
index++;//截取的位置向后移动一个
i = index;//subStr的第一个字符位置
j = 0;//重新从目标串的第一个字符匹配
}
}
if(child[j] == '\0') return index+1;//表示子串全都比较了一遍
else
return 0;
}
int main()
{
char str1[] = "ababcdef";
char str2[] = "abc";
cout << BF(str1,str2);
return 0;
}