算法导论—KMP
2016-02-25 10:46
183 查看
华电北风吹
日期:2016/2/24
KMP精要:
KMP在进行朴素匹配时,如果发现不匹配字符时,通过对已经匹配的那部分字符串的最大前缀来快速找到下一个模式串需要匹配的位置。KMP对模式进行预处理时间复杂度O(m),匹配时间复杂度O(n),总的KMP时间复杂度为O(m+n)。
参考资料:
关于kmp原理讲解具体可以参考字符串匹配的KMP算法— 阮一峰
参考代码:
日期:2016/2/24
KMP精要:
KMP在进行朴素匹配时,如果发现不匹配字符时,通过对已经匹配的那部分字符串的最大前缀来快速找到下一个模式串需要匹配的位置。KMP对模式进行预处理时间复杂度O(m),匹配时间复杂度O(n),总的KMP时间复杂度为O(m+n)。
参考资料:
关于kmp原理讲解具体可以参考字符串匹配的KMP算法— 阮一峰
参考代码:
#include <iostream> #include <string> #include <vector> using namespace std; class Solution { public: vector<int> nextVector(string pattern) { int m = pattern.size(); vector<int> result(m); for (int i = 1; i < m; i++) { int j = result[i - 1]; while (j&&pattern[i] != pattern[j]) j = result[j - 1]; result[i] = pattern[i] == pattern[j] ? j + 1 : 0; } return result; } vector<int> KMP(string str, string pattern) { int n = str.size(), m = pattern.size(); vector<int> arr = nextVector(pattern); vector<int> result; int p = 0; for (int i = 0; i < n; i++) { while (p>0 && pattern[p] != str[i]) p = arr[p - 1]; if (str[i] == pattern[p]) p++; if (p == m) result.push_back(i - p + 1); } return result; } }; int main(int argc, _TCHAR* argv[]) { Solution s; string str = "BBC ABCDAB ABCDABCDABDE"; string patter = "ABCDABD"; vector<int> v = s.KMP(str, patter); for (auto i : v) cout << i << endl; getchar(); return 0; }
相关文章推荐
- 从细节看一个产品的前景
- 水晶報表函數
- PHP CURL获取cookies模拟登录的方法
- Android控件
- KindEditor-编辑器配置参数属性
- JCIP-6-Task Execution
- iOS获取设备电量、内存、容量
- MapReduce 算法设计-Inverted Indexing
- Fiddler使用技巧
- Python爬虫实战(5):模拟登录淘宝并获取所有订单(1)
- linux shell脚本监控进程,如果进程不在,则重启之
- ligerui tab使用
- 【网络基本功一】细说网络传输
- 50个实用的jquery案例
- SVM(一) 问题的提出
- 2015 免费申请邓白氏码的步骤
- expect-学习文档
- 使用order by和rownum时特别注意
- 数组中重复的数字
- 完全卸载Mysql