KMP算法是一种改进的字符串匹配的算法。
1.关键是利用匹配失败后的信息,尽量减少模式串和朱穿的匹配次数以达到快速匹配的目的。具体实现就是实现一个next[]函数,函数本身包含了模式串的局部匹配信息。
2.执行时间:O(m+n),其中m,n代表字符串S和T的长度。
代码:
#include<iostream>
#include<cstring>
using namespace std;
int next[100];
void GetNext(string t)
{
int len=t.length();
int k;
next[0]=-1;
for(int j=1;j<len;j++)
{
int m=0,n=0;
for(k=1;k<=j-1;k++)
{
string a=t.substr(0,k);
string b=t.substr(j-k,k);
if(a==b)
{
n=k;
}
}
next[j]=n;
}
}
int KMP(string s,string t,int next[])
{
int i=0,j=0;
while(s[i]!='\0' && t[j]!='\0')
{
if(s[i]==t[j])
{
i++;j++;
}
else
{
j=next[j];
}
if(j==-1)
{
i+=1;
j+=1;
}
}
if(t[j]=='\0') return i-j;
return 0;
}
int main()
{
string s="ababaababcb";
string t="ababc";
GetNext(t);
cout<<KMP(s,t,next)<<endl;
return 0;
}