初学者。如果有误请指正,欢迎联系QQ2684162190
//字符串T中T[0]不储存T的长度
#include <stdio.h>
void ClearString(char s[])
{
int i=0;
while(s[i]!='\0')
{
s[i] = '\0';
i++;
}
}
int StrLength(char s[])
{
int i=0;
while(s[i]!='\0')
i++;
return i;
}
void get_next(char T[],int *next)
{
int i,j;
i=1;
j=0;
next[1]=0;
while(i<=StrLength(T))
{
if(j==0 || T[i-1]==T[j-1]) //T【i】表示后缀的单个字符
{ //T[J]表示前缀的单个字符
++i;
++j;
next[i]=j;
}
else
j=next[j]; //若字符不相同则J值回溯
}
}
void get_nextval(char T[],int *nextval)
{
int i,j;
i=1;
j=0;
nextval[1]=0;
while(i<StrLength(T))
{
if(j==0||T[i-1]==T[j-1])
{
i++;
j++;
if(T[i-1]!=T[j-1])
nextval[i]=j;
else
nextval[i]=nextval[j];
}
else
j=nextval[j];
}
}
//若主串的第pos个字符 之后存在与T相等的子串,则返回第一个这样的子串在s中的位置,否则返回0
int Index_KMP(char s[],char T[], int pos)
{
int i=pos;
int j=1;
int next[255];
get_next(T,next);
// get_nextval(T,next);
while(i<=StrLength(s)&&j<=StrLength(T))
{
if(j==0 ||s[i-1]==T[j-1])
{
i++;
j++;
}
else
j=next[j];
}
if(j>StrLength(T))
return i-StrLength(T)-1;
else
return 0;
}
int Index(char s[],char T[],int pos)
{
int i=pos;
int j=i;
while(i<=StrLength(s)&&j<=StrLength(T))
{
if(s[i]==T[j])
{
i++;
j++;
}
else
{
i=i-j+2;
j=1;
}
}
if(j>StrLength(T))
return i-StrLength(T);
else
return 0;
}
int main()
{
char s[100]="aaabaaaba";
char T[100]="aaa";
int m=Index_KMP(s,T,0);
printf("%d",m);
return 0;
}