Head.H
#define MAXSIZE 30
typedef struct _str
{
char data[MAXSIZE];
int len;
}Str, *str;
str InitString(void);
void PrintStr(str s);
void StrAssign(str s, char *ch);
void GetNextArray(str T, int *next);
int FindStringIndex_KMP(str s, str t);
int FindStringIndex(str s, str t);
Function.C
str InitString(void)
{
str s = (str)malloc(sizeof(Str));
return s;
}
void PrintStr(str s)
{
if (s->len == 0)
{
printf("This String is empty ! \n");
return;
}
for (int i = 0; i < s->len; i++)
{
printf("%c", s->data[i]);
}
printf("\n");
}
void StrAssign(str s, char *ch)
{
int i;
for (i = 0; ch[i] != '\0'; i++)
{
if (i < MAXSIZE - 1)
{
s->data[i] = ch[i];
}
}
s->len = i;
}
void GetNextArray(str S, int *next)
{
next[0] = 0;
int k = 0; //前缀的长度
for (int i = 1; i < S->len; i++)
{
while (k > 0 && S->data[k] != S->data[i])
{
k = next[k - 1];
}
if (S->data[k] == S->data[i])//说明p[0...k-1]共k个都匹配了
{
k = k + 1;
}
next[i] = k;
}
}
int FindStringIndex_KMP(str s, str t)
{
if (t->len > s->len)
{
printf("The string be found should shorter ! \n");
return -1;
}
int *nextarray = (int*)malloc(sizeof(int)*t->len);
GetNextArray(t, nextarray);
int i = 0;
int matchlen = 0;
while ((i < s->len) && (s->len - i >= t->len))
{
if (s->data[i] == t->data[0]) //如果开头匹配
{
for (int j = 0; j < t->len; j++)
{
if (s->data[i + j] != t->data[j])
{
i = i + (matchlen - nextarray[matchlen - 1]); //根据next数组移动距离 ¥¥¥¥¥
matchlen = 0;
break;
}
else
{
matchlen++;
}
if (matchlen == t->len)
{
return i;
}
}
}
else //不匹配
{
i++;
}
}
return -1;
}
int FindStringIndex(str s, str t)
{
if (t->len > s->len)
{
printf("The string be found should shorter ! \n");
return -1;
}
int i = 0;
int matchlen = 0;
while ((i < s->len) && (s->len - i >= t->len))
{
if (s->data[i] == t->data[0])
{
for (int j = 0; j < t->len; j++)
{
if (s->data[i + j] != t->data[j])
{
i++;
matchlen = 0;
break;
}
else
{
matchlen++;
}
if (matchlen == t->len)
{
return i;
}
}
}
else
{
i++;
}
}
return -1;
}
Main.C
void main(void)
{
char a[] = "BBC ABCDAB ABCDABCDABDE";
char b[] = "ABCDABD";
str S1 = InitString();
str S2 = InitString();
StrAssign(S1, a);
StrAssign(S2, b);
PrintStr(S1); //BBC ABCDAB ABCDABCDABDE
PrintStr(S2); //ABCDABD
int *next = (int*)malloc(sizeof(int)*S2->len);
GetNextArray(S2, next);
for (int i = 0; i < S2->len; i++)
{
printf("%d ", next[i]);
}
printf("\n");
int index = FindStringIndex_KMP(S1, S2);
printf("Find index: %d \n", index);
printf("\n");
system("pause");
}