C 언어 데이터 구조 코드 - 직렬 KMP 일치 알고리즘 구현
#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 !
");
return;
}
for (int i = 0; i < s->len; i++)
{
printf("%c", s->data[i]);
}
printf("
");
}
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 !
");
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 !
");
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("
");
int index = FindStringIndex_KMP(S1, S2);
printf("Find index: %d
", index);
printf("
");
system("pause");
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C 언어 구현 천둥 제거 게임 상세 정보먼저 작은 메뉴를 표시하고 게임을 할지 여부를 선택하십시오.사용자가 종료를 선택하면 프로그램 실행이 끝나고, 사용자가 게임을 선택하면 지뢰 제거 위치 좌표를 입력하라는 메시지가 표시됩니다.사용자가 입력한 좌표가 바둑...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.