KMP算法
来源:互联网 发布:怎么在手机淘宝交电费 编辑:程序博客网 时间:2024/04/30 11:38
KMP算法用于解决字符串匹配问题,时间复杂度O(n+m),m、n分别为目标串和模式串的长度,而一般的匹配BF算法,时间复杂度是O(n*m)。KMP算法在匹配的过程中,减少了目标串和模式串指针的多次回溯,才降低了时间复杂度。
KMP算法本质预处理模式串,求出next[]函数,即模式串中前缀和后缀相等且最长的值。
对于next[]数组的定义如下:
1) next[j] = -1 j = 0
2) next[j] = max(k): 0<k<j P[0...k-1]=P[j-k,j-1]
3) next[j] = 0 其他
如:
P a b a b a
j 0 1 2 3 4
next -1 0 0 1 2
即next[j]=k>0时,表示P[0...k-1]=P[j-k,j-1]
因此KMP算法的思想就是:在匹配过程称,若发生不匹配的情况,如果next[j]>=0,则目标串的指针i不变,将模式串的指针j移动到next[j]的位置继续进行匹配;若next[j]=-1,则将i右移1位,并将j置0,继续进行比较。
代码实现如下:
因此KMP算法的关键在于求算next[]数组的值,即求算模式串每个位置处的最长后缀与前缀相同的长度, 而求算next[]数组的值有两种思路,第一种思路是用递推的思想去求算,还有一种就是直接去求解。
1.按照递推的思想:
根据定义next[0]=-1,假设next[j]=k, 即P[0...k-1]==P[j-k,j-1]
1)若P[j]==P[k],则有P[0..k]==P[j-k,j],很显然,next[j+1]=next[j]+1=k+1;
2)若P[j]!=P[k],则可以把其看做模式匹配的问题,即匹配失败的时候,k值如何移动,显然k=next[k]。
void getNext(char *p,int *next){ int j,k; next[0]=-1; j=0; k=-1; while(j<strlen(p)-1) { if(k==-1||p[j]==p[k]) //匹配的情况下,p[j]==p[k] { j++; k++; next[j]=k; } else //p[j]!=p[k] k=next[k]; }}
- KMP算法详解 【KMP】
- 【KMP】KMP算法模板
- KMP hihoCoder1015 KMP算法
- kmp算法
- KMP算法
- KMP算法
- KMP算法
- KMP算法
- KMP 算法
- kmp算法
- KMP算法
- kmp算法
- KMP算法
- KMP算法
- kmp算法
- kmp算法
- KMP算法
- KMP算法
- 黑马程序员----枚举
- 成员函数作为线程函数调用
- NYOJ题目744蚂蚁的难题(一)(数学,不大懂)
- 实现:Linux主机做路由,为子网实现共享上网
- 黑马程序员----实例方法跟类方法的区别
- KMP算法
- 推送系统里使用 UPD 还是TCP做心跳包?
- Android开发系列(九):创建数据库以及完成简单的CRUD操作
- 递归算法的时间复杂度分析
- Matlab基础学习---------常用的数学函数实例学习
- 二叉树的建立(非递归建立与定义建立)与基本操作(广度和深度遍历,求叶子树高)实现
- linux C++ 共享库导出类
- 九度_题目1356:孩子们的游戏(圆圈中最后剩下的数)
- 二分插入排序