#include<stdio.h>
#include<string.h>
int Index(char *s,char *t,int pos) //普通算法
{
int i = pos;
int j = 0;
int len1,len2;
len1 = strlen(s);
len2 = strlen(t);
while (i<len1&&j<len2)
{
if (s[i]==t[j])
{
++i;
++j;
}
else
{
i=i-j+1;
j=0;
}
}
if (j>=len2)
{
return i-len2;
}
else
{
return -1;
}
}
void GetNext(char *t,int next[]) //获得next[]数组
{
int i;
int j;
int len1;
len1 = strlen(t);
i = 0;
j = -1;
next[0]=0;
len1 = strlen(t);
while (i<len1)
{
if (j==-1||t[i]==t[j])
{
++i;
++j;
next[i]=j+1;
}
else
{
j = next[j]-1;
}
}
}
int KMP(char *s,char *t,int next[]) //KMP算法
{
int i = -1;
int j = -1;
int len1;
int len2;
len1 = strlen(s);
len2 = strlen(t);
while (i<len1&&j<len2)
{
if (j==-1||s[i]==t[j])
{
++i;
++j;
}
else
{
j = next[j]-1;
}
}
if (j>=len2)
{
return i-len2;
}
else return -1;
}
int main()
{
int flag;
int len;
char *s = "acabaabcaabaabaabcacaabc";
char *t = "abaabcac";
int next[100];
len = strlen(t);
GetNext(t,next);
for (int i=0;i<len;i++)
{
printf("%d ",next[i]);
}
printf("/n");
flag = KMP(s,t,next);
printf("%d/n",flag);
return 0;
}