原理参考该视频
#include<stdio.h>
#include<stdlib.h>
int MyKmp(char str[],char substr[],int next[]);
void getnext(char substr[],int next[]);
void getnextval(char substr[], int nextval[]);
int main()
{
char str[] = "ABACABABAABACA";
char strsub[] = "ABA";
int next[sizeof(str)-1];
int nextval[sizeof(str)-1];
getnext(strsub, next);
int i = 0;
printf("next[]:");
for (i; i < strlen(strsub); ++i)
{
printf("%d ",next[i]);
}
printf("\n");
getnextval(strsub, nextval);
int j = 0;
printf("nextval[]:");
for (j; j < strlen(strsub); ++j)
{
printf("%d ", nextval[j]);
}
printf("\n");
int pos = MyKmp(str,strsub,next);
printf("next:pos:%d\n",pos);
int posval = MyKmp(str, strsub, nextval);
printf("nextval:posval:%d", posval);
return 0;
}
int MyKmp(char str[], char substr[], int next[])
{
int i = 0, j = 0;
while (i<strlen(str)&&j<strlen(substr))
{
if (j == -1 || str[i] == substr[j])
{
++i; ++j;
}
else
j = next[j];
}
if (j == strlen(substr))
return i- strlen(substr)+1;
else
return 0;
}
void getnext(char substr[], int next[])
{
int i = 0, j = -1;
next[0] = -1;
while (i<strlen(substr))
{
if (j == -1 || substr[i] == substr[j])
{
++i; ++j;
next[i] = j;
}
else
j = next[j];
}
}
void getnextval(char substr[], int nextval[])
{
int i = 0, j = -1;
nextval[0] = -1;
while (i < strlen(substr))
{
if (j == -1 || substr[i] == substr[j])
{
++i; ++j;
if (substr[i] != substr[j])
nextval[i] = j;
else
nextval[i] = nextval[j];
}
else
j = nextval[j];
}
}
#include<stdio.h>
#include<stdlib.h>
int MyKmp(char str[],char substr[],int next[]);
void getnext(char substr[],int next[]);
void getnextval(char substr[], int nextval[]);
int main()
{
char str[] = "xABACABABAABACA";
char strsub[] = "xBABAABAC";
int next[sizeof(strsub)];
int nextval[sizeof(strsub)];
getnext(strsub, next);
int i = 1;
printf("next[]:");
for (i; i < strlen(strsub); ++i)
{
printf("%d ",next[i]);
}
printf("\n");
getnextval(strsub, nextval);
int j = 1;
printf("nextval[]:");
for (j; j < strlen(strsub); ++j)
{
printf("%d ", nextval[j]);
}
printf("\n");
int pos = MyKmp(str,strsub,next);
printf("next:pos:%d\n",pos);
int posval = MyKmp(str, strsub, nextval);
printf("nextval:posval:%d", posval);
return 0;
}
int MyKmp(char str[], char substr[], int next[])
{
int i = 1, j = 1;
while (i<strlen(str)&&j<strlen(substr))
{
if (j == 0 || str[i] == substr[j])
{
++i; ++j;
}
else
j = next[j];
}
if (j == strlen(substr))
return i- strlen(substr)+1;
else
return 0;
}
void getnext(char substr[], int next[])
{
int i = 1, j = 0;
next[1] = 0;
while (i<strlen(substr))
{
if (j == 0 || substr[i] == substr[j])
{
++i; ++j;
next[i] = j;
}
else
j = next[j];
}
}
void getnextval(char substr[], int nextval[])
{
int i = 1, j = 0;
nextval[1] = 0;
while (i < strlen(substr))
{
if (j == 0 || substr[i] == substr[j])
{
++i; ++j;
if (substr[i] != substr[j])
nextval[i] = j;
else
nextval[i] = nextval[j];
}
else
j = nextval[j];
}
}