KMP算法 数据结构

kmp.h

文件的建立

typedef int Status;
#define MAXSTRLEN 255
typedef struct 
{
char data[MAXSTRLEN+1];
int length;
}HString;


Status Concat(HString &T,HString S1,HString S2);
void StrAssign(HString &S,char cstr[]);
Status StrCopy(HString &T,HString S);
Status StrEmpty(HString S);
Status StrCompare(HString S,HString T);
Status StrLength(HString S);
Status ClearString(HString &S);
Status Concat(HString &S);
Status SubString(HString &Sub,HString S,int pos,int len);
int Index(HString S,HString T);
Status Replace(HString &S,HString T,HString V);
Status StrInsert(HString &S,int pos,HString T);
Status StrDelete(HString &S,int pos,int len);
Status DestroyString(HString &S);
Status Index_KMP(HString S,HString T);
void get_nextval(HString T,int nextval[]);
void DispStr(HString s);
void get_next(HString T,int next[]);
Status Index_KMP1(HString S,HString T);


KMPS.cpp 文件的建立



#include "stdafx.h"
#include "kmp.h"




Status Concat(HString &T,HString S1,HString S2)
{
int i,uncut;
if(S1.length+S2.length<=MAXSTRLEN)
{
T.length=S1.length+S2.length;
for(i=1;i<=S1.length;i++)
           T.data[i]=S1.data[i];
for(i=S1.length+1;i<=S1.length+S2.length;i++)
T.data[i]=S2.data[i-S1.length];
uncut=TRUE;
}
else if(S1.length<MAXSTRLEN)
{
for(i=1;i<=S1.length;i++)
T.data[i]=S1.data[i];
        for(i=S1.length+1;i<=MAXSTRLEN;i++)
T.data[i]=S2.data[i-S1.length];
T.length=MAXSTRLEN;
uncut=FALSE;
}
else
{
        for(i=1;i<=MAXSTRLEN;i++)
T.data[i]=S1.data[i];
uncut=FALSE;
}


return uncut;
}


void StrAssign(HString &S,char cstr[])
{

int i;
for (i=1;cstr[i-1]!='\0';i++)
S.data[i]=cstr[i-1];
S.length=i-1;
}


Status StrCopy(HString &T,HString S)
{
int i=0;
T.length=S.length;
while(S.data[i]!='\0')
{
T.data[i]=S.data[i];
}
return OK;
}


Status StrEmpty(HString S)
{
if(S.length==0&&S.data[1]=='\0')
return TRUE;
else
return FALSE;
}


Status StrCompare(HString S,HString T)
{
    
return OK;
}


Status StrLength(HString S)
{

return S.length;
}


Status ClearString(HString &S)
{
int i;
for(i=1;i<=S.length;i++)
S.data[i]='\0';
S.length=0;
return OK;
}


Status Concat(HString T,HString S1,HString S2)
{
int i;
T.length=S1.length+S2.length;
for(i=1;i<=S1.length;i++)
           T.data[i]=S1.data[i];
for(i=S1.length+1;i<=S1.length+S2.length;i++)
T.data[i]=S2.data[i-S1.length];
return OK;
}


Status SubString(HString &Sub,HString S,int pos,int len)
{
int i;
for(i=pos;i<=len;i++)
Sub.data[i-pos-1]=S.data[i];
Sub.data[0]=len;
return OK;
}


int Index(HString S,HString T)
{
int i=1,j=0;
while (i<=S.length && j<T.length) 
{ if (S.data[i]==T.data[j])
{ i++;
j++;
}
else
{ i=i-j+1;
j=0;
}
}
if (j>=T.length)
return(i-T.length-1);
else
return(-1);
}


Status Replace(HString &S,HString T,HString V)
{
    
return OK;
}


Status StrInsert(HString &S,int pos,HString T)
{
int i;
    HString P;
P.length=S.length+T.length;
for(i=1;i<=pos-1;i++)
        P.data[i]=S.data[i];
for(i=pos;i<=T.length;i++)
P.data[i]=T.data[i-pos+1];
for(i=pos;i<=S.length;i++)
P.data[i+T.length]=S.data[i];
for(i=1;i<=P.length;i++)
S.data[i]=P.data[i];
S.length=P.length;
return OK;
}


Status StrDelete(HString &S,int pos,int len)
{


HString P;
int i;
    P.length=S.length-len;
for(i=1;i<=pos-1;i++)
        P.data[i]=S.data[i];
    for(i=pos+len;i<=S.length;i++)
P.data[i-len]=S.data[i];
return OK;
}


Status DestroyString(HString &S)
{


free(S.data);
return OK;
}


Status Index_KMP(HString S,HString T)
{
   int nextval[MAXSTRLEN+1];
   get_nextval(T,nextval);
   int i,j;
   j=1;
   i=1;
   while(i<=S.length&&j<=T.length)
   {
  if(j==0||S.data[i]==T.data[j])
  {
  ++i;
  ++j;
  }
  else 
  {
  
  j=nextval[j];
  }
   }
   if(j>T.length)
  return i-T.length;
   else 
  return 0;
}


void get_nextval(HString T,int nextval[])
{
int i,j;
i=1;
nextval[1]=0;
j=0;
while(i<T.length)
{
if(j==0||T.data[i]==T.data[j])
{
++i;
++j;
if(T.data[i]!=T.data[j])
nextval[i]=j;
else
nextval[i]=nextval[j];
}
else 
j=nextval[j];
}
}
void DispStr(HString s)
{ int i;
if (s.length>0)
{ for (i=1;i<=s.length;i++)
printf("%c",s.data[i]);
printf("\n");
}
}


void get_next(HString T,int next[])
{
   int i,j;
i=1;
   next[1]=0;
   j=0;
   while(i<T.length)
   {
  if(j==0||T.data[i]==T.data[j])
  {
  ++i;
  ++j;
  next[i]=j;
  
  }
  else
  j=next[j];
   }
}


Status Index_KMP1(HString S,HString T)
{
   int next[MAXSTRLEN+1];
   get_next(T,next);
   int i,j;
   j=1;
   i=1;
   while(i<=S.length&&j<=T.length)
   {
  if(j==0||S.data[i]==T.data[j])
  {
  ++i;
  ++j;
  }
  else 
  {
  
  j=next[j];
  }
   }
   if(j>T.length)
  return i-T.length;
   else 
  return 0;
}

主函数所在的文件

#include "stdafx.h"
#include "kmp.h"


int main(int argc, char* argv[])
{
//printf("Hello World!\n");
int j,a;
int nextval[MAXSTRLEN+1],next[MAXSTRLEN+1];
HString s,t;
StrAssign(s,"abcabcdabcdeabcdefabcdefg");
StrAssign(t,"abcdeabcdefab");
printf("串s:");DispStr(s);
printf("串t:");DispStr(t);


get_nextval(t,nextval); //由模式串t求出nextval值
get_next(t,next);
printf("    j   ");
for (j=1;j<=t.length;j++)
printf("%4d",j);
printf("\n");
printf(" t[j]   ");
for (j=1;j<=t.length;j++)
printf("%4c",t.data[j]);
printf("\n");


printf("\n");
printf(" nextval");
for (j=1;j<=t.length;j++)
printf("%4d",nextval[j]);
printf("\n");
printf("改进的KMP算法:\n");
a=Index_KMP(s,t);
printf("  t在s中的位置=%d\n",a);
printf("<------------------------------------------------------------>\n");
printf("    j   ");
for (j=1;j<=t.length;j++)
printf("%4d",j);
printf("\n");
printf(" t[j]   ");
for (j=1;j<=t.length;j++)
printf("%4c",t.data[j]);
printf("\n");
printf(" next   ");
for (j=1;j<=t.length;j++)
printf("%4d",next[j]);
printf("\n");


printf("旧版的KMP算法:\n");
a=Index_KMP1(s,t);
printf("  t在s中的位置=%d\n",a);
    system("pause");
return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

StriveZs

用爱发电

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值