#include<iostream>
//BMP算法在主串和模式串匹配字符很多但又不完全匹配时,效率有明显提高
/*
算法思路
1.next数组的每个位置必须赋值
2.BMP算法主要研究模式串
*/
void initNext(int next[]) //给next数组赋值
{
int j = 0;
char _arr[] = "ABABABBAA"; //目标模式串 -- 可以自行修改
int len = sizeof(_arr); //获取目标串长度
next[0] = 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位置的公共串长度
}
}
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;
}
字符串匹配算法(BMP)(c++)
于 2022-05-04 18:44:30 首次发布