KMP算法
2015-08-06 23:56
337 查看
解决问题:用于求解一个串是否在另一个串中出现以及出现了多少次?
时间复杂度:O(n+m) 空间复杂度:O(m)
算法:
1、next[ ]数组的求解
2、根据next[ ]数组进行匹配
KMP算法next[ ]数组求解:
1、next[ ]数组保存部分匹配值,用于字符串分析,不用于kmp算法的求解
KMP算法标准模板:
时间复杂度: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 10010 using 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; }
相关文章推荐
- STP 根桥、根端口、指定端口是如何选举的
- 亚马逊云存储签名算法问题
- JavaEE面试题,
- MySQL5.5出面ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)问题的解决办法
- Ogre 编辑器一(MyGUI+Ogre整合与主界面)
- HOG特征+SVM训练过程
- VIM 使用技巧
- CKEditor 集成CKFinder集成
- MySQL性能调优与架构设计——第2章 MySQL架构组成
- 让ecshop用户名、手机号、email登陆方法
- 1159 Common Subsequence
- Unity获取游戏对象详解
- 让Ecshop网店系统用户自动登陆
- Codeforces Round #313 Gerald and Giant Chess (dp+组合数取模)
- C++学习笔记——多态性与虚函数
- http协议详讲
- a[href*=javablackbelt]{color:red};
- android学习笔记(0)搭建android开发环境的前前后后
- 微软AJAX解决方案
- 使用CXF开发web service 的客户端 (四)