满意答案
#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分享举报