KMP字符串模式匹配算法
当我们使用简单字符串模式匹配算法时,时间复杂度为O(n*m),这里n为目标串的长度,m为模式串的长度。在循环的过程中,有很多次匹配其实存在回溯,浪费了很多时间。可以根据模式串本身的性质来设计一个新的高效算法,即跳过肯定不匹配的循环,而直接从左边子串已经相同的位置开始比较,时间复杂度大大降低,该算法就是KMP字符串模式匹配算法。
#include <iostream>
#include <string>
using namespace std;
int KMPIndexHelp(const string &T,const string &P,int pos,int next[]){
int i=pos,j=0;
while(i<T.length() && j<P.length())
{
if(j==-1)
{
i++; j=0;
}
else if(T[i]==P[j]){
i++; j++;
}
else
{
j=next[j];
}
}
if(j<P.length()) return false;
else return i-j;
}
void GetNext(const string &P,int next[])
{
next[0]=-1;
int j=0,k=-1;
while(j<P.length()-1)
{
if(k==-1)
{
next[j+1]=0;
j++;k=0;
}
else if(P[k]==P[j])
{
next[j+1]=k+1;
j++;k++;
}
else
{
k=next[k];
}
}
}
int KMPIndex(const string &T,const string &P,int pos=0){
int *next=new int[P.length()];
GetNext(P,next);
int result=KMPIndexHelp(T,P,pos,next);
delete []next;
return result;
}
int main()
{
int r=0;
string T="acabaabaabcacx";
string P="abaabcac";
cout << KMPIndex(T,P,r) <<endl;
return 0;
}