BF算法
BF算法流程
主串i 和子串j 分别从下标为0 的地方开始匹配: 相等,向后移动: 相等,在向后移动: 此时就不相等了;
i 和j 分别回退: 继续比较:
不相等,继续向后移动。 一直退到这里: 相等,向后退: 还是相等的,继续退; 匹配成功: 当 j 和自己长度相等时,表示找到了 匹配失败:
移动到最后时: 此时不匹配,i会+1:
BF算法流程代码实现
#include <iostream>
#include <memory>
using namespace std;
int BF(string s, string t)
{
int i = 0;
int j = 0;
while (i < s.size() && j < t.size())
{
if (s[i] == t[j])
{
i++;
j++;
}
else
{
i = i - j + 1;
j = 0;
}
}
if (j == t.size())
{
return i - j;
}
else
{
return -1;
}
}
int main()
{
string s = "ABCDCABDEFG";
string t = "ABD";
int pos = BF(s, t);
cout << pos << endl;
}
BF算法的时间与空间复杂度
字符串优化算法: KMP、字典树、倒排索引
BF算法的问题
问题: 此时,不匹配,需要将i置为i-j+1,j=0; 然后,B和开头的A进行比较,其实是没有必要的,因为前面两个A,B本来就是不同的,相对应位相同,移动后,肯定不同啊。
#include <iostream>
#include <memory>
using namespace std;
int BF(string s, string t)
{
int i = 0;
int j = 0;
while (i < s.size() && j < t.size())
{
if (s[i] == t[j])
{
i++;
j++;
}
else
{
i = i - j + 1;
j = 0;
}
}
if (j == t.size())
{
return i - j;
}
else
{
return -1;
}
}
int* getNext(string str)
{
int* next = new int[str.size()];
int j = 0;
int k = -1;
next[j] = k;
========================================未优化版本============================================
while (j < str.size() - 1)
{
if (-1 == k || str[k] == str[j])
{
j++;
k++;
next[j] = k;
}
else
{
k = next[k];
}
}
return next;
}
==============================================================================================
========================================优化版本===============================================
while (j < str.size() - 1)
{
if (-1 == k || str[k] == str[j])
{
j++;
k++;
if (str[k] == str[j])
{
next[j] = next[k];
}
else
{
next[j] = k;
}
}
else
{
k = next[k];
}
}
return next;
}
==============================================================================================
int KMP(string s, string t)
{
int i = 0;
int j = 0;
int* next = getNext(t);
unique_ptr<int> ptr(next);
cout << t << " : ";
for (int m = 0; m < t.size(); m++)
{
cout << next[m] << " ";
}
cout << endl;
int size1 = s.size();
int size2 = t.size();
while (i < size1 && j < size2)
{
if (-1 == j || s[i] == t[j]) 如果首字母匹配失败,这里j == -1
{
i++;
j++;
}
else
{
j = next[j];
}
}
if (j == t.size())
{
return i - j;
}
else
{
return -1;
}
}
int main()
{
string s = "abcabdefabcabc";
string t = "abcabc";
int pos = KMP(s, t);
cout << pos << endl;
}
|