#include<iostream>
using namespace std;
#include<string>
//BF
int BF(string& a,string& b)
{
//求出a串的长度
int sizeA=a.length();//返回的是字符串中字符个数
//求出b串的长度
int sizeB = b.length();
//i指向A,j指向B子串
int i=0;
int j=0;
//b是子串,a
while (i <=sizeA-1&&j<= sizeB-1)
{
if (a[i]==b[j])
{
i++;
j++;
}
else
{
//i回到上一次开始位置的下一个位置
//当前j的值等于i移动的次数,i现在的值减去i移动的次数,回到i起始位置
//往后移动一次,相当于加1
i = i - j + 1;
//j回到子串头部
j = 0;
}
}
//i的值是按下标从0开始本身应该是8,j的值本身应该是4,但最后一次匹配成功后,还有一次i++和j++
cout << "循环结束后i=" << i << endl;
cout << "循环结束后j=" << j << endl;
//判断是匹配成功还是匹配失败
if (j == sizeB)
{
//退出循环时i记录的是自串的最后一个字符在主串中的位置加一
//j记录的是子串的最后一个元素的位置加一,等于子串的长度
//i-j得到的是子串的第一个字符在主串中的位置
return i-j;//匹配成功,返回子串在主串中的起始位置
}
else
{
return -1;
}
}
//测试代码--------------
void test()
{
string a = "goodgoolegoodpeople";
string b = "goole";
//在a串中找出b串的起始位置,并返回
int pos=BF(a, b);
cout << pos << endl;
}
int main()
{
test();
system("pause");
return 0;
}