KMP算法
来源:互联网 发布:软件成本分析报告 编辑:程序博客网 时间:2024/06/05 08:20
解决问题:用于求解一个串是否在另一个串中出现以及出现了多少次?
时间复杂度:O(n+m) 空间复杂度:O(m)
算法:
1、next[ ]数组的求解
2、根据next[ ]数组进行匹配
KMP算法next[ ]数组求解:
1、next[ ]数组保存部分匹配值,用于字符串分析,不用于kmp算法的求解
void Pre_kmp(char x[],int m,int next[]){///原始next数组:部分匹配值 int j=next[0]=0; for(int i=1;i<m;++i) { while(0!=j && x[i]!=x[j]) j = next[j-1]; if (x[i]==x[j]) j++; next[i] = j; }}2、next[ ]数组一般求解方法
void Pre_kmp(char x[],int m,int next[]){ int j=next[0]=-1; int i=0; while(i<m){ if(-1!=j&&x[i]!=x[j]) j=next[j]; next[++i]=next[++j]; }}3、针对aaaaaaaaaaaaaab这样的模板串进行优化的next[ ]数组方法
void Pre_kmp(char x[],int m,int next[]){///优化后 int j=next[0]=-1; int i=0; while(i<m){ while(j!=-1&&x[i]!=x[j]) j=next[j]; if(x[++i]==x[++j]) next[i]=next[j];///优化处理 else next[i]=j; }}
KMP算法标准模板:
#include <iostream>#define MAXN 10010using namespace std;void Pre_kmp(char x[],int m,int kmpNext[]){ int i,j; j=kmpNext[0]=-1; i=0; while(i<m){ while(-1!=j&&x[i]!=x[j]) j=kmpNext[j]; if(x[++i]==x[++j]) kmpNext[i]=kmpNext[j]; else kmpNext[i]=j; }}int next[MAXN];int KMP_Count(char x[],int m,char y[],int n){ //x是模式串,y是主串 int ans=0; Pre_kmp(x,m,next);///预处理得到模式串x的next数组 int i,j; i=j=0; while(i<n){ while(j!=-1 && y[i]!=x[j]) j=next[j];///j==-1表示第一个字符x[0]与y[i]不匹配 i++;j++; if(j>=m){ ans++; j=next[j]; } } return ans;}
0 0
- KMP算法详解 【KMP】
- 【KMP】KMP算法模板
- KMP hihoCoder1015 KMP算法
- kmp算法
- KMP算法
- KMP算法
- KMP算法
- KMP算法
- KMP 算法
- kmp算法
- KMP算法
- kmp算法
- KMP算法
- KMP算法
- kmp算法
- kmp算法
- KMP算法
- KMP算法
- VIM 使用技巧
- HOG特征+SVM训练过程
- JavaEE面试题,
- JS时间格式化出现2015-02-07 hh:12:30
- hdu 3183 A Magic Lamp(给一个n位的数,从中删去m个数字,使得剩下的数字组成的数最小(顺序不能变),然后输出)
- KMP算法
- BootStrap警告框
- 读《javascript权威指南》第五版 第七章 对象与数组
- 上课时的一些笔记代码篇
- 如何实现列表滑动标签置顶效果(以天天动听、网易云音乐、虾米音乐的歌手页为例)
- Android SimpleAdapter源码解析
- nginx源码分析1———进程间的通信机制六(UNIX域协议)
- HDU 3487(Play with Chain-Splay)[template:Splay]
- OC数组[官方文档]