模式匹配:KMP算法
来源:互联网 发布:给文件加密的算法 编辑:程序博客网 时间:2024/06/05 01:07
传统的暴力模式匹配算法是不断地查找、回溯,但回溯的过程浪费时间,但在弄清楚匹配的子串结构时并不需要回溯,而是不断地向前匹配,降低时间复杂度。但KMP算法提出的时候并不是最快速的,后来还有人将它优化。
KMP算法的关键在于构建匹配串当中元素之间联系的next数组。
传统的KMP算法:
#include <iostream>#include <cstring>using namespace std;const int maxn = 100000+5;char s[maxn], p[maxn];int next[maxn];void get_next(int pn){ int i = 0, k = -1; next[0] = -1; while(i < pn){ if(k == -1 || p[i] == p[k]){ i++; k++; next[i] = k; } else k = next[k]; }}int kmp(int sn, int pn){ int i = 0, k = 0; while(i <= sn){ if(k == -1 || s[i] == p[k]) { i++; k++; } else k = next[k]; if(k == pn) break; } if(i <= sn) return i-k; else return maxn;}int main(){ int sn, pn; cin >> s >> p; sn = strlen(s); pn = strlen(p); get_next(pn); for(int i = 0; i < pn; i++) cout << next[i] << " " ; cout << kmp(sn, pn) << endl;}
改良的KMP算法:
#include <iostream>#include <cstring>using namespace std;const int maxn = 100000+5;char s[maxn], p[maxn];int next[maxn];void get_next(int pn){ int i = 0, k = -1; next[0] = -1; while(i < pn){ if(k == -1 || p[i] == p[k]){ i++; k++; if(p[i] == p[k]) next[i] = next[k]; else next[i] = k; } else k = next[k]; }}int kmp(int sn, int pn){ int i = 0, k = 0; while(i <= sn){ if(k == -1 || s[i] == p[k]) { i++; k++; } else k = next[k]; if(k == pn) break; } if(i <= sn) return i-k; else return maxn;}int main(){ int sn, pn; cin >> s >> p; sn = strlen(s); pn = strlen(p); get_next(pn); for(int i = 0; i < pn; i++) cout << next[i] << " "; cout << endl << kmp(sn, pn) << endl;}
阅读全文
0 0
- 模式匹配---KMP算法
- 模式匹配 KMP算法
- 模式匹配-KMP算法
- KMP模式匹配算法
- KMP模式匹配算法
- KMP模式匹配算法
- 模式匹配kmp算法
- 模式匹配算法kmp
- KMP模式匹配算法
- KMP模式匹配算法
- KMP模式匹配算法
- KMP模式匹配算法
- KMP模式匹配算法
- KMP模式匹配算法
- KMP模式匹配算法
- KMP模式匹配算法
- KMP算法模式匹配
- KMP 模式匹配算法
- 五分钟掌握微信小程序轮播图
- MySql关键字汇总
- L3
- 内存溢出和内存泄漏的区别、产生原因以及解决方案
- 单片机温习
- 模式匹配:KMP算法
- 基于文本和图片的商品分类
- 图像处理基础知识
- Hyperledger Fabric 1.0架构及原理
- 用Python给头像加上圣诞帽
- 关于Javaweb下ssh框架的getHibernateTemplate的No default constructor for entity异常处理
- NAND Flash SSD 是如何生产出来的?
- 请给我一个女票@andyqian
- AD绘制PCB时候移动原件焊盘