模式匹配算法的改进——KMP算法
来源:互联网 发布:淘宝运营计划怎么写 编辑:程序博客网 时间:2024/05/16 15:48
其基本思想是:每当匹配过程中出现字符串比较不等时,不需回溯i指针,而是利用已经得到的“部分匹配”结果将模式向右“滑动”尽可能远的一段距离后,继续进行比较。
假设主串为“s1s2,...sn",模式串为”p1p2...pn",当主串中第i个字符与模式串中第j个字符“失配”(比较不等)时,主串第i字符(i指针不回溯)应与模式中哪个字符再比较?
令当s[i]!=p[j]时,s[i]应与p[next[j]]进行比较。
例如: P="abaabcac"
KMP算法查找串S中含串P的个数count
#i nclude <iostream>
#i nclude <stdlib.h>
#i nclude <vector>
using namespace std;
inline void NEXT(const string& T,vector<int>& next)
{
//按模式串生成vector,next(T.size())
next[0]=-1;
for(int i=1;i<T.size();i++ ){
int j=next[i-1];
while(T[i]!=T[j+1]&& j>=0 )
j=next[j] ; //递推计算
if(T[i]==T[j+1])next[i]=j+1;
else next[i]=0; //
}
}
inline string::size_type COUNT_KMP(const string& S,
const string& T)
{
//利用模式串T的next函数求T在主串S中的个数count的KMP算法
//其中T非空,
vector<int> next(T.size());
NEXT(T,next);
string::size_type index,count=0;
for(index=0;index<S.size();++index){
int pos=0;
string::size_type iter=index;
while(pos<T.size() && iter<S.size()){
if(S[iter]==T[pos]){
++iter;++pos;
}
else{
if(pos==0)++iter;
else pos=next[pos-1]+1;
}
}//while end
if(pos==T.size()&&(iter-index)==T.size())++count;
} //for end
return count;
}
int main(int argc, char *argv[])
{
string S="abaabcacabaabcacabaabcacabaabcacabaabcac";
string T="ab";
string::size_type count=COUNT_KMP(S,T);
cout<<count<<endl;
system("PAUSE");
return 0;
- 模式匹配算法的改进——KMP算法
- 串模式匹配的改进算法——KMP算法
- 改进的模式匹配算法——KMP算法
- 串的模式匹配改进--KMP算法
- C++ 改进的KMP模式匹配算法
- 模式匹配的一种改进算法----KMP算法
- KMP算法----模式匹配的一种改进算法
- KMP(改进模式匹配算法)--串
- KMP模式匹配算法及改进
- 串的模式匹配算法——KMP算法解析
- 【原创】朴素的模式匹配和改进的模式匹配(KMP)算法说明(草稿)
- 朴素的模式匹配和改进的模式匹配(KMP)算法说明
- 模式匹配的KMP 算法
- 模式匹配的算法Kmp
- 字符串模式匹配——KMP算法
- 字符串模式匹配——KMP算法
- 经典算法——KMP模式匹配
- 数据结构——串(朴素的模式匹配算法、KMP模式匹配算法)
- 您未必知道的Js技巧
- 一个配置管理员的困惑
- C#.net中web工程中创建用户控件和被调用的方法
- 什么是苦瓜?
- 文件名及其扩展名的重要性
- 模式匹配算法的改进——KMP算法
- map 文件的使用
- PD中如何使其生成的sql语句不带双引号的方法
- 我的一次和坏人做斗争的经验(他的qq被盗了,坏人利用他的qq和我聊天)
- 关于SQL优化的问题
- C# 文件操作(上传 下载 删除 文件列表...)
- 博客开张
- 为VS.NET 2005增加Atlas Scripts的代码提示功能
- AJAX如何用于Web部件