KMP算法实现
#include <stdio.h>// #include <string.h>
#include <assert.h>
#include<stdlib.h>
#define maxlen 255
typedef struct
{
char ch[maxlen];
int length;
}SString;
//求字符串长度
int strlen(char* p)
{
assert(p != NULL);
int count = 0;
while (*p != '\0')
{
count++;
p++;
}
return count;
}
//给t.ch初始值赋值
bool strassign(SString &t, char * str)
{
int len=strlen(str);
if(len>maxlen)
return false;
for(int i=0;i<=len;i++){
t.ch[i+1]=str[i];
}
t.length=len;
return true;
}
//求next数组
void get_next(SString t,int next[]){
next[0]=-1;
next[1]=0;
int i=1,j=0;
while (i<=t.length)
{
if(j==0||t.ch[i]==t.ch[j]){
next[++i]=++j;
}
else
j=next[j];
}
}
//kmp
int Index_KMP(SString S,SString T,int next[]){
int i=1,j=1;
while(i<=S.length&&j<=T.length){
if(j==0||S.ch[i]==T.ch[j]){
++i;
++j; //继续比较后续字符
}
else{
j=next[j]; //模式串右移
}
}
if(j>T.length)
return i-T.length; //匹配成功
else
return 0;
}
int main(){
SString s,t;
char ch1[]="abcabaaabcd";
char ch2[5]="abcd";
strassign(s,ch1);
strassign(t,ch2);
int *next;
next=(int*)malloc(sizeof(int)*(t.length+1));
get_next(t,next);
for (int i=0;i<=t.length;i++){
printf("%d ",next[i]);
}
int i=Index_KMP(s,t,next);
if(i)
printf("\n匹配成功!\n下标为%d",i);
else
printf("匹配失败!");
return 0;
}
如有问题请联系我 QQ:1021395023