// KMP_algorithm.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include<iostream>
using namespace std;
class KMP
{
private:
public:
//KMP();
void matchStr(char source[], char match[]);
void getNext(char match[], int length, int next[]);
int findStr(char source[], int slength, char match[], int mlength, int next[]);
};
int KMP::findStr(char source[], int slength, char match[], int mlength, int next[])
{
int i=0, j=0;
while(i<slength && j<mlength)
{
if(j==-1 || source[i]==match[j])
{
i++;
j++;
}
else
j=next[j];
}
if(j>=mlength-1)
return i-mlength+1;
else
return 0;
}
void KMP::matchStr(char source[], char match[])
{
int slength = 0;
int mlength = 0;
while(source[slength]!='\0')
slength++;
while(match[mlength]!='\0')
mlength++;
int* next=new int[mlength];
getNext(match, mlength, next);
int result;
result=findStr(source, slength, match, mlength, next);
cout<<"Result is: "<<result<<endl;
delete[] next;
}
void KMP::getNext(char match[], int mlength, int next[])
{
int i=0, k=-1;
//int next[length];
next[0]=-1;
while(i<mlength-1)
{
while(k>=0 && match[i]!= match[k])
k=next[k];
i++;
k++;
if(match[i] == match[k])
next[i]=next[k];
else
next[i]=k;
}
}
int main()
{
char source[]="babddebdbdy";
char match[]="bdy";
KMP kp;
kp.matchStr(source, match);
}
结果如下: