子串查找的算法-----BM
2016-09-12 22:45
232 查看
字符串的匹配有著名的KMP之外还有另外一个算法,Boyer-Moore算法
下面是根据一篇文章学习来写出的BM算法的代码.算是学习下.
附上学习文章的链接http://blog.jobbole.com/104854/
下面是根据一篇文章学习来写出的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; }
相关文章推荐
- 约数的计算
- kubernetes学习笔记
- 理解 Python 中的 *args 和 **kwargs
- 浅谈android相关背景
- 循环赛日程表问题
- JavaSE知识点查漏补缺(2)
- hibernate原理及架构
- 80老翁谈人生(164):北京大学为何力挺薄熙来?
- 冒泡排序法
- Blockchain
- Android 九年,我们需要学什么?
- 在不改变php.ini的情况下修改文件上传大小
- 在不改变php.ini的情况下修改文件上传大小
- 在不改变php.ini的情况下修改文件上传大小
- 在不改变php.ini的情况下修改文件上传大小
- 在不改变php.ini的情况下修改文件上传大小
- 在不改变php.ini的情况下修改文件上传大小
- 在不改变php.ini的情况下修改文件上传大小
- 在不改变php.ini的情况下修改文件上传大小
- 在不改变php.ini的情况下修改文件上传大小