kmp算法c语言代码加注释,串的KMP算法c语言描述代码

满意答案

#include

#include

#include

#include

#include

voidgetNext(constchar*t,int*Next)//gettheNextarray

{

intk=-1;

intj=0;

intsize=strlen(t);

Next[0]=-1;

while(j

{

if(k==-1||t[j]==t[k])//ifk==-1therearetwoconditions

//oneisthisisthefirsttimeenteringtheloop

{//ift[j]==t[k]getthenext[j+1]directly

k++;//theotheristheendoftheiterationcosk==-1;

j++;

Next[j]=k;//whateverNext[j]=k

}

else

k=Next[k];

}

}

intmyStrstr(constchar*Dest,constchar*subStr)//findthestartingpositionofthesub

{//intheDestthroughKMP

intdestSize=strlen(Dest);

intsubSize=strlen(subStr);

inti,j;

int*Next=(int*)(malloc(sizeof(int)*subSize));

i=j=0;

assert((Dest!=NULL)&&(subStr!=NULL));

getNext(subStr,Next);

while(i

{

if(j==-1||Dest[i]==subStr[j])//ifj==-1themainstringneedmatchthenextelements

{//andthesubStringbeginfromthebeginning

i++;//ifDest[i]==subStr[j]bothstringneedshifttothe

j++;//nextelements

}

else

j=Next[j];//ifmatchfail,glidebacktoNext[j]

}

if(j==subSize)returni-j;

return-1;

}

intmain()

{

char*temp,*sub,*Dest;//tostorethesubstringtobematched

intch;

unsignedinttemplen,length=20*sizeof(char);

unsignedintmlength=20*sizeof(char);//theoriginallengthofthememory

sub=(char*)malloc(length);

Dest=(char*)malloc(length);

if(sub==NULL||Dest==NULL)//allocationfailure

{

printf("memoryallocatefailure\n");

exit(0);

}

temp=sub;

printf("pleaseinputthesubstring:\n");

while((ch=getchar())!=10)//readthesubString

{

if((temp-sub)/sizeof(char)==length)//ifrunningoutofthememory

{

templen=length;

sub=realloc(sub,length+=20*sizeof(char));

if(sub==NULL)

{

printf("submemoryallocatefailure\n");

exit(0);

}

temp=sub+templen*sizeof(char);//resetthetempcosthesubmaychangeitsvalue

}

*temp++=ch;

}

*temp='\0';

temp=Dest;

printf("pleaseinputthemainstring:\n");

while((ch=getchar())!=10)//readthemainString

{

if((temp-Dest)/sizeof(char)==mlength)

{

templen=mlength;

Dest=realloc(Dest,mlength+=20*sizeof(char));//ifrunningoutofthememory

if(Dest==NULL)

{

printf("submemoryallocatefailure\n");

exit(0);

}

temp=Dest+templen*sizeof(char);//resetthetempcostheDestmaychangeitsvalue

}

*temp++=ch;

}

*temp='\0';

printf("thestartingpositionis:%d\n",myStrstr(Dest,sub));//getthestartingposition

free(Dest);

free(sub);

return0;

}

00分享举报

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值