//递推求解
#include <string.h>
int* getNext( char* pattern)
{
int len=strlen(pattern);
int* next=new int[len];//动态创建内存
next[0]=-1;
for(int i=1; i<len; i++)
{
int j=next[i-1];
while(j!=-1 && pattern[j]!=pattern[i-1])
j=next[j];
if(j==-1)
next[i]=0;
else
next[i]=j+1;
}
return next;
}
//非递推算法
void getNext(char* p ,int next[], int len)
{
for(int i=0; i<len; i++)
next[i]=-1;
next[1]=0;
for(int k=2; k<len; k++)
{
for(int i=1; i<k; i++)
{
int m=i;
int n=0;
while(m!=k && p[m]==p[n])
{
m++;
n++;
}
if(m==k)
{
next[k]=n;
break;
}
}
if(next[k]==-1)
next[k]=0;
}
for(i=0; i<len; i++)
cout<<next[i]<<" ";
cout<<endl;
}
完整的KMP算法实现
#include <IOSTREAM.H>
#include <string.h>
void getNext(char* p, int* next, int len)
{
next[0]=-1;
for(int i=1; i<len; i++)
{
int j=next[i-1];
while(p[j]!=p[i-1] && j>-1)
j=next[j];
if(j==-1)
next[i]=0;
else
next[i]=j+1;
}
}
void match(char* dest, char* pattern)
{
int p_len=strlen(pattern);
int* next=new int[p_len];
getNext(pattern,next,p_len);
int i=0;
int j=0;
int dest_len=strlen(dest);
while(i<dest_len)
{
while(i<dest_len && j<p_len)
{
if(dest[i]==pattern[j])
{
i++;
j++;
}
else
{
next[j]!=-1 ? j=next[j] : i++,j=0;//三目运算符,等同于if else语句!
}
}
if(j==p_len)
cout<<i-j<<endl;
i++;
j=0;
}
/*
while(i!=slen && j!=tlen)
{
if(s[i]==t[j])
{
i++;
j++;
}
else
{
j=next[j];
if(j==-1)
{
i++;
j=0;
}
}
}
IF(J==TLEN)。。。.
ELSE。。。
*/
}
void main()
{
char* dest="abcdcdcdcfjcdadbcdfjdbdfeed";
char* pattern="cdc";
match(dest,pattern);
}