70,023
社区成员




#include<stdio.h>
#include<string.h>
typedef char DataType;
void GetNext(DataType* t, int* next, int tlength)
{
int i = 1, j = 0;
next[1] = 0;
while (i < tlength)
{
if (j == 0 || t[i] == t[j])
{
++i;
++j;
next[i] = j;
printf("i = %d, next[%d] = %d\n", i, i, next[i]);
}
else
{
j = next[j];
printf("++++%d\n", j);
}
printf("i = %d\n", i);
}
}
int IndexKmp(DataType *s, DataType *t, int pos, int tlength, int slength, int *next)
{
int i = pos, j = 1;
while (i <= slength&&j <= tlength)
{
if (j == 0 || t[j]==s[i])
{
i++;
j++;
}
else {
j = next[i];
printf("****i = %d, %d\n", i, j);
}
}
if (j > tlength)
return i - tlength;
else
return 0;
}
int main()
{
int locate, tlength, slength, next[256];
DataType s[256], t[256];
printf("输入主串:\n");
scanf("%s", s);
slength = strlen(s);
printf("输入子串:\n");
scanf("%s", t);
tlength = strlen(t);
GetNext(t, next, tlength);
locate = IndexKmp(s, t, 0, tlength, slength, next);
printf("匹配位置:%d\n", locate);
return 0;
}
代码逻辑有问题,GetNext函数会将下标为1, 2, 3.。。设置为1,但是下标为0的为随机数;
当进入IndexKmp函数时,初始化j = 1;那么循环中j == 0就不会运行。所以直接是j = next[i];此时i为0,跳出循环;