KMP算法C++实现
#include "datatype.h"
void get_next(Hstring hstring,int next[])
{
int i=0;
next[0]=-1;
int j=-1;
while(i<hstring.length)
{
if(j==-1||hstring.ch[i]==hstring.ch[j])
{
++i;
++j;
next[i]=j;
}
else
j=next[j];
}
}
void get_nextval(Hstring hstring,int nextval[])
{
int i=0;
nextval[0]=-1;
int j=-1;
while(i<hstring.length)
{
if(j==-1||hstring.ch[i]==hstring.ch[j])
{
++i;
++j;
nextval[i]=j;
if(hstring.ch[i]!=hstring.ch[j])
nextval[i]=j;
else
nextval[i]=nextval[j];
}
else
j=nextval[j];
}
}
int KMP(Hstring hstring1,Hstring hstring2,int next[])
{
int i=0;
int j=-1;
while(i<hstring1.length-1&&j<hstring2.length-1)
{
if(j==-1||hstring1.ch[i]==hstring2.ch[j])
{
i++;
j++;
}
else j=next[j];
}
if(j=hstring2.length-1)
return i-hstring2.length+1;
else
return 0;
}
int main(int argc, char** argv){
Hstring str1{
{'a','b','a','a','b','c','a','c'},
8,
};
Hstring str2{
{'a','b','c','a'},
4,
};
int next[4];
get_next(str1,next);
int m=KMP(str1,str2,next) ;
cout<<"匹配到的位置为:"<<m<<endl;
return 0;
}
#include<iostream>
using namespace std;
#define maxsize 100
typedef struct{
char ch[100];
int length;
}Hstring;