#include <stdio.h>
#include <stdlib.h>
typedef struct String {
char* data;
int len;
} String;
//结构体初始化
String* create_string(){
String* s = (String*)malloc(sizeof(String));
s->data = NULL;
s->len = 0;
return s;
}
//数组内容输入
void Add_string(String* s, char* data) {
if (s->data) {
free(s->data);
}
int len = 0,i;
char* temp = data;
while (*temp) {
len++;
temp++;
}
if (len == 0) {
s->data = NULL;
s->len = 0;
}
else {
temp = data;
s->len = len;
s->data = (char*)malloc(sizeof(char) * (len + 1));
for (i = 0; i < len; i++, temp++) {
s->data[i] = *temp;
}
}
}
//输出数组内容
void printString(String* s) {
int i;
for (i = 0; i < s->len; i++) {
printf(i == 0 ? "%c " : "-> %c ", s->data[i]);
}
printf("\n");
}
//获取next数组内容
int* getNext(String* s) {
int* next = (int*)malloc(sizeof(int) * s->len);
int i = 0;
int j = -1;
next[i] = j;
while (i < s->len-1 ) {
if (j == -1 ||s->data[i] == s->data[j]) {
i++;
j++;
next[i] = j;
}
else
j = next[j];
}
return next;
}
//输出next数组内容
void printNext(int* next, int len) {
int i;
for (i = 0; i < len; i++) {
printf(i == 0 ? "%d " : "-> %d ", next[i]+1 );
}
printf("\n");
}
//Kmp算法
void KmpMatch(String* s1, String* s2, int* next) {
int i = 0;
int j = 0;
while (i < s1->len && j < s2->len) {
if (j == -1 || s1->data[i] == s2->data[j]) {
i++;
j++;
}
else {
j = next[j];
}
}
if (j == s2->len)
printf("kmp match success.\n");
else
printf("kmp match fail.\n");
}
int main(int argc, char* argv[]) {
int i;
String* s1 =create_string();
String* s2 =create_string();
Add_string(s1, argv[1]);
printString(s1);
Add_string(s2, argv[2]);
printString(s2);
int* next=getNext(s2);
printNext(next, s2->len);
KmpMatch(s1, s2, next);
return 0;
}