#include<iostream>
//BMP算法在主串和模式串匹配字符很多但又不完全匹配时,效率有明显提高
/*
算法思路
1.next数组的每个位置必须赋值
2.匹配情况做什么
3.不匹配情况做什么
*/
void initNext(int next[]) //给next数组赋值
{
int j = 0;
char _arr[] = "ABABABBAA";
int len = sizeof(_arr); //获取字符串长度
next[0] = 0; //首字符一定没有公共串
for (int i = 1; i < len; i++)
{
while (_arr[i] != _arr[j] && j > 0){j = next[j - 1];} //当字符相等且j>0时,没匹配上
//j获得上一位置记录的公共串长,再同当前i对比
if (_arr[i] == _arr[j]) { j++;} //字符相等 -- j前进至下一位置
next[i] = j; //记录i位置的公共串长度
}
}
// ABABABBABABABABBAB
void test(int next[])
{
char _arr[] = "ABBBABABBABABABBABABABABBABABABABBABABABABBABBBBAABABBAAAAABABABBAABC";
char child[] = "ABABABBAA";
int L1 = sizeof(_arr) - 1, L2 = sizeof(child) - 1;
int num = 0;
int i = 0, j = 0;
while (i < L1 && j < L2 )
{
num++;
if (_arr[i] == child[j]) { i++; j++; } //当前字符相等 匹配下一字符
else if(_arr[i] != child[j] && j > 0) { j = next[j - 1]; } //不相等回退至主串和模式串的最长公共串位置进行对比
else { i++; } //j == 0 且j位置元素与主串的当前元素不等 i前进一位置
}
std::cout <<"位置:" << i - j << std::endl;
std::cout << "次数:" << num << std::endl;
}
int main()
{
int next[10] = { 0 };
initNext(next);
test(next);
//test();
return 0;
}