【KMP算法简介】
KMP算法是由克努特(Knuth)、莫里斯(Morris)和普拉特(Pratt)共同设计实现的,因此简称KMP算法。此算法可以在O(n+m)的时间数量级上完成串的模式匹配操作。KMP算法中模式串T的next数组,是KMP算法的核心。
KMP算法中的next数组仅取决于模式串本身,而与相匹配的主串无关。
next数组的核心作用是“当模式串T的第j位与主串S的第pos位失配时(即 T[j]≠S[pos] 时),让模式串T的第next[j]位与主串S的第pos位再进行比较”。这相当于让模式串T往右移动了 j-next[j] 位后,再进行比较。
【KMP算法步骤】
KMP算法本身并不复杂,但绝大部分的文章把它讲混乱了,以致造成很多混淆。KMP算法主要分为两步:求next[ ]数组、匹配字符串。
一、求next[ ]数组
由于字符串的下标从0开始,因此在KMP算法的设计中,将模式串下标从0开始计数,是很自然的事情。据此,可定义next[0]=-1,next[1]=0。之后,按照“(1)若第i-1位的字符与第j位的字符相等,则next[i]=j+1; (2)若直到第0位依然没有字符与第i-1位的字符相等,则next[i]=0”构建next数组。
最后,利用循环体中的语句 cout<
二、匹配字符串
此步主要体现了next()数组的核心作用,即“当模式串T的第j位与主串S的第pos位失配时(即 T[j]≠S[pos] 时),让模式串T的第next[j]位与主串S的第pos位再进行比较”。这相当于让模式串T往右移动了 j-next[j] 位后,再与主串进行比较。
【KMP算法代码】
- #include
- using namespace std;
-
- const int maxn=100;
- int ne[maxn];
-
- void getNext(string s) {
- int len=s.length();
- int i=0, j=-1;
- ne[0]=-1;
- while(i
- if(j==-1 || s[i]==s[j]) {
- i++;
- j++;
- ne[i]=j;
- } else j=ne[j];
- }
- }
-
- int KMP(string S,string T) {
- int lens=S.length();
- int lent=T.length();
- int i=0;
- int j=0;
- while(i
- if(j==-1 || S[i]==T[j]) {
- i++;
- j++;
- } else j=ne[j];
- }
-
- if(j==lent) return i-j+1;
- else return -1;
- }
-
- int main() {
- string S,T;
- getline(cin,S);
- getline(cin,T);
-
- getNext(T);
- cout<<KMP(S,T)<
-
- return 0;
- }
-
-
- /*
- input:
- i love china.
- e c
- output:
- 6
- */
【参考文献】
https://blog.csdn.net/hnjzsyjyj/article/details/127086502
https://blog.csdn.net/hnjzsyjyj/article/details/127105603
-
相关阅读:
【补充】Java程序设计接口实验作业
嵌入式中I2C 相关的硬件问题汇总及死锁解决办法
【CSS】基础CSS样式属性
高数_证明_方向导数计算公式
BlueToolFixup.kext2.6.5(所有蓝牙部分驱动)
【云原生之kubernetes实战】安装kubeopertor教程
DBConvert Studio All Editions 3.0.6 Crack
1636. 按照频率将数组升序排序-c语言自定义二重排序
windbg正确搜索堆上和栈上内存方法
C语言参数类型
-
原文地址:https://blog.csdn.net/hnjzsyjyj/article/details/127112363