KMP算法
来源:互联网 发布:godaddy域名别名解析 编辑:程序博客网 时间:2024/05/17 01:39
KMP算法理解
设模式串为pattern[0,1,2…p-1]
核心思想
- 找到模式子串pattern[0,1,2…k-1]的真后缀同时也是pattern[0,1,2…p-1]的最大前缀的长度(pattern的总长度是p,0<=k<=p),存入pi数组。
- 利用pi数组来避免模式串和主串的不必要的比较,提高效率
KMP算法C++代码
#include <iostream>#include <string>#include <vector>using namespace std;//得到模式串的pi数组void get_pi(string pattern, int plen, int *pi){ if (pattern.size() == 0) return; int k = -1; pi[0] = -1; for (int i = 1; i < plen; i++){ while (k > -1 && pattern[i] != pattern[k + 1]) k = pi[k]; if (pattern[i] == pattern[k + 1]) k = k + 1; pi[i] = k; } return;}//找到所有的模式串在主串中的位置,并存入vector中返回vector<int> search_substr(string str, string pattern){ vector<int> subindex; int plen = pattern.length(), strlen = str.length(), q = -1; int *pi = new int[plen]; get_pi(pattern, plen, pi); for (int i = 0; i < strlen; i++){ while (q > -1 && str[i] != pattern[q + 1]) q = pi[q]; if (str[i] == pattern[q + 1]) q = q + 1; if (q == plen - 1) { subindex.push_back(i-plen+1); q = pi[q]; } } delete[] pi; return subindex;}//主函数int main(){ string str = "ababcabcacbabcac"; string pattern = "abcac"; vector<int> subindex = search_substr(str, pattern); for (auto iter : subindex){ cout << iter<< endl; } getchar(); return 0;}
0 0
- KMP算法详解 【KMP】
- 【KMP】KMP算法模板
- KMP hihoCoder1015 KMP算法
- kmp算法
- KMP算法
- KMP算法
- KMP算法
- KMP算法
- KMP 算法
- kmp算法
- KMP算法
- kmp算法
- KMP算法
- KMP算法
- kmp算法
- kmp算法
- KMP算法
- KMP算法
- iOS封装功能生成 .framework
- swjtuoj月赛 C题 (dfs+剪枝)
- CSDN日报20170318——《一个程序员的五年工作总结》
- mabaties常用结果返回类型总结
- WisKey的眼神(hdu 1577)
- KMP算法
- Qt4.8.5+OpenCV2.4.X+QtCreator2.1 开发环境 win7/8安装配置指南 (转载)
- git操作分支
- scrapy知乎模拟登录和cookie登录
- C
- 二分写法
- python机器学习包 Windows下 pip安装 scikit-learn numpy scipy
- Java多线程之死锁情形(持续更新)
- html5-02