BF法就是brute force暴力法,就是在主串里面一个一个字符向后移去查找是否存在需要查找的子字符串。
第一种方法查找所有出现的字符串在主字符串里的下标:
vector<int> bfSearch(string &text, string &substr)
{
vector<int> begIndex;
int n = text.size();
int m = substr.size();
//注意这里是i<=n-m不是i<n-m
for (int i = 0; i <= n - m; i++)
{
int j = 0;
for (; j < m; j++)
{
if (substr[j] != text[i+j])
{
break;
}
}
if (j == m)
{
//注意这里是i,不是i-m
begIndex.push_back(i);
}
}
return begIndex;
}
测试:
int main()
{
string str1 = "abcddbeddbaddb";
string substr = "ddb";
vector<int> vi = bfSearch(str1, substr);
for(auto x:vi)
cout<<x<<" ";
cout<<endl;
system("pause");
return 0;
}
运行:
显式回溯,查找第一个出现的字符串在主串中的下标:
int bfSearchTrackBack(string &text, string &substr)
{
int n = text.size();
int m = substr.size();
int j = 0;
int i = 0;
for (; i<=n-m && j<m; i++)
{
if (text[i] == substr[j])
{
j++;
}
else
{
i = i-j; //回溯,后面还有i++,所以这里不用+1.
j = 0;
}
}
if (j == m)
return i-m;
return n;
}
测试:
int main()
{
string str1 = "abcddbeddbaddb";
string substr = "ddb";
cout<<bfSearchTrackBack(str1, substr)<<endl;
system("pause");
return 0;
}
运行: