kmp算法:用一个数组保存了上一个需要开始搜索的index,比如AAACAAA就是0, 1, 2, 0, 1, 2, 3, ABCABC就是0, 0, 0, 1, 2, 3,复杂度O(M+N)

 #include <iostream>
#include <map>
#include <vector>
#include <algorithm>
#include <string> using namespace std; int main()
{
string pattern = "ABCABC";
string s = "ABCABCABCABCBCABC";
vector<int> lps(pattern.size());
int len = ;
int i = ;
lps[] = ;
while (i < pattern.size()) {
if (pattern[i] == pattern[len]) {
len++;
lps[i] = len;
i++;
}
else if (len != ) len = lps[len-];
else {
lps[i] = ;
i++;
}
}
//for (int i = 0; i < pattern.size(); i++) cout << lps[i] << endl;
i = ;
int j = ;
while (i < s.size()) {
if (s[i] == pattern[j]) {
j++;
i++;
}
if (j == pattern.size()) {
cout << i - j << endl;
j = lps[j-];
}
else if (pattern[j] != s[i]) {
if (j != ) j = lps[j-];
else i++;
}
}
return ;
}

robin-karp算法,给pattern做hash-value,给s前pattern.size()的子串也做hash-value,如果相同则输出当前位置,如果不相同则去掉这个子串的第一个,加上新进来的那个字符。复杂度最好是O(M+N),最差O(M*N)。

http://www.geeksforgeeks.org/searching-for-patterns-set-3-rabin-karp-algorithm/

FA算法:http://www.geeksforgeeks.org/searching-for-patterns-set-5-finite-automata/

Boyer Moore Algorithm - bad character heuristic: 记录各个字母在pattern最后出现的位置,从后往前比较,如果不匹配,就向前移动s当前字母在pattern的位置与当前匹配到的位置的差值,如果这个位置在当前位置后,则只能往前移一个。复杂度最好是O(N/M),最坏是O(N*M)。

http://www.geeksforgeeks.org/pattern-searching-set-7-boyer-moore-algorithm-bad-character-heuristic/

最新文章

  1. 关于Apache/Tomcat/JBOSS/Neginx/lighttpd/Jetty等一些常见服务器的区别比较和理解
  2. 通过系统架构漏洞获取系统VIP资源
  3. LintCode First Position of Target
  4. C#集合-列举(Enumeration)
  5. Powerdesigner 导出Excel格式数据字典 导出Excel格式文件
  6. Mongo DB 安装-及分布式集群部署(初稿)
  7. oracle、db2、sybase大型数据库面试总结
  8. Juqery遮罩插件
  9. vue.js开发环境搭建以及创建一个vue实例
  10. react-native中的动画
  11. 架构师成长之路4.4-多维监控体系_zabbix
  12. 物联网架构成长之路(8)-EMQ-Hook了解、连接Kafka发送消息
  13. Chocolatey 简介(软件自动化管理工具)
  14. Solidworks公司电脑图纸被加密之后如何解密输出
  15. 我也谈谈.NET程序员工资低
  16. HDU 4568 Hunter 最短路+TSP
  17. 【2018CCPC秦皇岛】
  18. hdu 3068
  19. 第六章 声明式服务调用: Spring Cloud Feign
  20. MFC自绘框架窗口客户区

热门文章

  1. 2016.7.12 去除mybatis-generator生成的class里的注释
  2. 从头认识java-14.2 进一步了解数组
  3. C 标准库 - &lt;assert.h&gt;
  4. 聚合数据Android SDK 12306火车票查询订票演示示例
  5. apue学习笔记(第八章 进程控制)
  6. OC中动态创建可变数组的问题.有一个数组,数组中有13个元素,先将该数组进行分组,每3个元素为一组,分为若干组,最后用一个数组统一管理这些分组.(要动态创建数组).两种方法
  7. linq查询去重
  8. 兔子--改动Android Studio的快捷键,改动成eclipse的快捷键
  9. ArcMap中使用ArcPy实现Geometry与WKT的相互转换
  10. 利用GROUP_CONCAT函数把相同信息的合并到同一个字段中