您的位置:首页 > 其它

子串查找的算法-----BM

2016-09-12 22:45 232 查看
字符串的匹配有著名的KMP之外还有另外一个算法,Boyer-Moore算法

下面是根据一篇文章学习来写出的BM算法的代码.算是学习下.

附上学习文章的链接http://blog.jobbole.com/104854/

#include<iostream>
#include<string>
#include<unordered_map>
#include<vector>

using namespace std;

int BM(const string &str, const string &substr)
{
unordered_map<char,int> delta;//存放str中的字符最后一次出现的位置
unordered_map<char, int> right;//用来存放子串中每个字符最右边的距离

unsigned sublen = substr.size();
unsigned len = str.size();
for (int i = len - 1; i >= 0; --i)
{
right[str[i]] = -1;
delta[str[i]] = -1;
}
for (int i =sublen - 1; i >= 0; --i)
{
if (right[substr[i]] == -1)
{
right[substr[i]] = i;
}
}

for (unsigned i = 0,skip = 0; i < len-sublen; i+=skip)
{
int j = sublen - 1;
delta[str[i+j]] = j;
for (; j >= 0; --j)
{
if (substr[j] != str[i + j])
{
skip =j - right[str[i + j]];
skip2 = j-delta[str[i+j]];
skip = skip < skip2 ? skip2 :skip;//取二者的最大值
if (skip < 1)
{
skip = 1;
}
break;
}
}
if (j + 1 == 0)
{
//当需要统计一共有多少个子串时,需要清空delta并重新初始化.然后在继续循环
return i;//这里就是找到了子串,函数的出口...
}
}

return -1;
}

int main()
{
string str;
string substr;
cin >> str >> substr;
cout<<BM(str,substr);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  子串的查找