题目
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/76a9e6253e67f24f37ed0cd9138964c6.png#pic_center)
解答
#include<stdio.h>
#include<string.h>
#define MAXSTRLEN 100
typedef char SString[MAXSTRLEN+1];
int StrAssign_Sq(SString s,char c[]){
int i,len;
len=strlen(c);
if(len>MAXSTRLEN)
return -1;
for(i=1;i<=len;i++)
s[i]=c[i-1];
s[0]=len;
return 1;
}
void StrPrint_Sq(SString S){
int i;
for(i=1; i<=S[0]; i++)
printf("%c", S[i]);
}
void getNext(SString p,int next[]){
int i=1;
int j=0;
next[1]=0;
while(i<p[0]){
if(p[i]==p[j]||!j){
i++;
j++;
next[i]=j;
}
else
j=next[j];
}
}
void getNextval(SString p,int next[]){
int i=1;
int j=0;
next[1]=0;
while(i<p[0]){
if(p[i]==p[j]||!j){
i++;
j++;
if(p[i]!=p[j])
next[i]=j;
else
next[i]=next[j];
}
else
j=next[j];
}
}
int KMP(SString s,SString p,int pos){
int i,j,next[MAXSTRLEN];
if(pos<1)
return 0;
i=pos;
j=1;
getNextval(p,next);
while(i<=s[0]&&j<=p[0]){
if(s[i]==p[j]||j==0){
i++;
j++;
}
else
j=next[j];
}
if(j>p[0])
return i-p[0];
else
return 0;
}
void main(){
char *s1="abcabca";
char *s2="ca";
int pos=1;
int f;
SString s;
SString p;
StrAssign_Sq(s, s1);
StrAssign_Sq(p, s2);
printf("主串中的元素为:s = ");
StrPrint_Sq(s);
printf("\n");
printf("子串中的元素为:p = ");
StrPrint_Sq(p);
printf("\n");
f=KMP(s,p,pos);
printf("子串在主串中首次出现的位置为%d\n",f);
}