c-,- 俺也贴个出来 ,写了很久了..
#include <iostream>
#include <cstring>
#define SIZE 13
using namespace std;
int Index_Bf(char *S,char *T){
//普通的匹配
int i=0,j=0;
while(S[i]!='\0'&&T[j]!='\0'){
if(S[i]==T[j]){
j++;
i++;
}
else{
i=i-j+1;j=0;
}
}
if(T[j]=='\0')
return i-j;
else
return false;
}
void Get_next(char *T,int *next){
//next求法
int j=-1;
int i=0;
next[0]=-1;
while(i<strlen(T)) {
if(j==-1 || T[i]==T[j])
{
i++;
j++;
next[i]=j;
}
else
j=next[j];
}
for(j=0;j<i;j++)
cout<<next[j]<<" ";
}
void Get_nextval(char *T,int *next){
//改进后的next求法
int j=-1;
int i=0;
next[0]=-1;
while(i<strlen(T)) {
if(j==-1 || T[i]==T[j]){
i++;
j++;
if(T[i]!=T[j])next[i]=j;
else next[i]=next[j];
}
else j=next[j];
}
for(j=0;j<i;j++)
cout<<next[j]<<" ";
}
int Index_KMP(char *S,char *T,int *next){
//KMP算法
int i=0,j=0;
while(S[i]!='\0'&&T[j]!='\0'){
if(S[i]==T[j]){
j++;
i++;
}
else{
j=next[j];
}
}
if(T[j]=='\0')
return i-strlen(T);
else
return false;
}
int main(){
char S[]="bcaaaabc";
char T[]="aaaab";
int next[SIZE];
//Get_next(T,next);
Get_nextval(T,next);
cout<<"T is found in "<<Index_KMP(S,T,next)<<";if return 0 ,fail."<<endl;
system("pause");
return 0;
}