kmp算法 编辑
KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法)。KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是实现一个next()函数,函数本身包含了模式串的局部匹配信息。时间复杂度O(m+n)。
1.部分匹配值
关键点
http://blog.youkuaiyun.com/britney_0330/article/details/60322488?locationNum=1&fps=1
该网址解释得很清楚
程序注意点:
vector给初始化,不然会越界,还没有想通为什么。
#include<iostream>
#include<string>
#include<vector>
using namespace std;
void makenext(string T,vector<int> &next)
{
int len=T.size();
next[0]=0;
for(int i=1,k=0;i<len;i++)
{
while(k>0&&T[i]!=T[k])
{
k=next[k-1];//回溯
}
if(T[i]==T[k])
{
k=k+1;
}
next[i]=k;
}
}
int kmp(string &T,string &W,vector<int> &next)
{
int len1=T.size();
int len2=W.size();
makenext(W,next);
for(int i=0,q=0;i<len1;i++)
{
while(q>0&&T[i]!=W[q])
{
q=next[q-1];
}
if(T[i]==W[q])
q=q+1;
if(q==len2)
{
cout<<i-len2+1<<endl;
q=next[q-1];
}
}
}
int main()
{
vector<int> hh(20,0);
string T="abacaabacabaabb";
string W="abacab";
int w=kmp(T,W,hh);
cout<<w<<endl;
return 0;
}