KMP学习笔记
来源:互联网 发布:面向对象程序设计软件 编辑:程序博客网 时间:2024/06/01 18:11
KMP算法的精髓就是next数组,必须充分理解这个next数组。
next[j]的含义就是j的真前缀中能够自匹配的最大前缀和后缀,相当于在失配的情况下
能够排除很多不必要的匹配过程。
构造next数组用递推:
void get_next (int *p) {int t;t = next[0] = -1;int j = 0;while (j < m) {if (t < 0 || p[j] == p[t]) {//匹配j++, t++;next[j] = t;}else //失配t = next[t];}}
比如0 0 0 0 0 0 0 1个文本串和0 0 0 1这个模式串,在对齐位置
0 0 0 0 0 0 0 1
0 0 0 1 下,每一次借助next数组模式串只会移动一格,本质上是因为没有应用
失配情况下相同的字符必然也失配这种规律,所以我们修改下next数组,把next[j]表示
为j的真前缀中能够自匹配的的前缀和后缀并且这个前缀的末尾字符和后缀的末尾字符不
同,这就是扩展kmp,让然用上面的文本串和模式串,在对对齐位置
0 0 0 0 0 0 0 1
0 0 0 1 下发成失配时,模式串会直接移动到
0 0 0 0 0 0 0 1
0 0 0 1,这样就避免了很多次不必要的匹配。
容易看出,在字符集规模越小的情况下扩展KMP的优势更加明显。
在原来的next数组的代码中只需改变一行就可以实现扩展KMP
void get_next (int *p) {int t;t = next[0] = -1;int j = 0;while (j < m) {if (t < 0 || p[j] == p[t]) {//匹配j++, t++;next[j] = (p[j] != p[t] ? t : next[t]);}else //失配t = next[t];}}
然后返回第一次匹配位置的主算法就很显然了
int kmp () {get_next (P);int i = 0, j = 0;while (i < n && j < m) {if (j < 0 || T[i] == P[j]) {i++, j++;}else {j = next[j];}if (j == m) {return i-j+1;}}return -1;}
HDU 1711:点击打开链接
最裸的KMP,直接借用上面的代码:
#include <cstring>#include <iostream>#include <cstdio>#include <algorithm>#include <vector>#include <cmath>using namespace std;#define maxn 1111111int P[maxn], T[maxn];int n, m;#define next Nextint next[maxn];void get_next (int *p) {int t;t = next[0] = -1;int j = 0;while (j < m) {if (t < 0 || p[j] == p[t]) {//匹配j++, t++;next[j] = (p[j] != p[t] ? t : next[t]);}else //失配t = next[t];}}int kmp () {get_next (P);int i = 0, j = 0;while (i < n && j < m) {if (j < 0 || T[i] == P[j]) {i++, j++;}else {j = next[j];}if (j == m) {return i-j+1;}}return -1;}int main () {int cas;cin >> cas;while (cas--) {scanf ("%d%d", &n, &m); for (int i = 0; i < n; i++)scanf ("%d", &T[i]);for (int i = 0; i < m; i++)scanf ("%d", &P[i]);printf ("%d\n", kmp ());}return 0;}
0 0
- KMP算法学习笔记
- KMP学习笔记
- 学习笔记-KMP算法
- KMP算法 学习笔记
- Kmp算法学习笔记
- KMP算法学习笔记
- KMP算法学习笔记
- KMP算法学习笔记
- KMP算法学习笔记
- KMP算法学习笔记
- 学习笔记-KMP算法
- KMP算法学习笔记
- KMP算法学习笔记
- KMP学习笔记
- KMP算法学习笔记
- KMP学习笔记
- KMP算法学习笔记
- 数据结构学习笔记:KMP
- Android之Activity
- OpenCV将连续图片合成视频AVI
- 学习PS基础教程
- 基于struts2的留言板系统&简单实现jdbc分页
- 软考之路(二)——计算机基础知识总结
- KMP学习笔记
- 线程中一些常用方法的分析
- HDU2087 剪花布条
- PAT乙级—1024. 科学计数法 (20)-native
- Activity四种加载模式
- HTML5之本地存储
- 用JavaScript搭建高性能App - React Native实战教程
- 找工作知识储备(3)---从头说12种排序算法:原理、图解、动画视频演示、代码以及笔试面试题目中的应用
- web前后台数据交互的方式