1.Force Math
#include <stdio.h>
#include <stdlib.h>
typedef struct String {
char* data;
int len;
}STRING, * PSTRING;
void ini_string(PSTRING S) {
S->data = (char*)malloc(sizeof(char));
S->data = NULL;
int len = 0;
}
void StringAssign(PSTRING S, char* data) {
if (S->data) {
free(S->data);
}
int Temp_len = 0;
while (data[Temp_len] != '\0') {
Temp_len++;
}
if (Temp_len == 0) {
S->data = NULL;
S->len = 0;
}
S->data = (char*)malloc(sizeof(char) * (Temp_len + 1));
S->len = Temp_len;
for (int i = 0; i < Temp_len; i++) {
S->data[i] = data[i];
}
S->data[Temp_len] = '\0';
}
void traverse(PSTRING S) {
printf("%s\n", S->data);
}
char* ForceMatch(PSTRING S, PSTRING C) {
int i = 0;
int j = 0;
while (i < S->len && j < C->len) {
if (S->data[i] == C->data[j]) {
i++;
j++;
}
else
{
i = i - j + 1;
j = 0;
}
}
if (j == C->len) {
printf("匹配成功");
}
else
{
printf("匹配失败");
}
}
int main() {
STRING S;
STRING C;
ini_string(&S);
ini_string(&C);
StringAssign(&S, "hello");
StringAssign(&C, "lo");
traverse(&S);
traverse(&C);
ForceMatch(&S, &C);
return 0;
}
2.KMP匹配
#include <stdio.h>
#include <stdlib.h>
typedef struct STRING {
char* data;
int len;
}STRING,*PSTRING;
PSTRING init() {
PSTRING S = (PSTRING)malloc(sizeof(STRING));
S->data = NULL;
S->len = 0;
return S;
}
void Assign(PSTRING S, char* data) {
int cnt = 0;
while (data[cnt] != '\0') {
cnt++;
}
S->data = (char*)malloc(sizeof(char) * cnt + 1);
S->len = cnt;
for (int i = 0; i < cnt; i++) {
S->data[i] = data[i];
}
S->data[cnt] = '\0';
}
int* GetNext(PSTRING S) {
int* Next = (int*)malloc(sizeof(int) * S->len);
int i = 0;
int j = -1;
Next[i] = j;
while (i < S->len) {
if (j == -1 || S->data[i] == S->data[j]) {
i++;
j++;
Next[i] = j;
}
else
{
j = Next[j];
}
}
return Next;
}
void KMP(PSTRING S, PSTRING B, int* Next) {
int i = 0;
int j = 0;
while (i < S->len && j < B->len) {
if (j == -1 || S->data[i] == B->data[j]) {
i++;
j++;
}
else
{
j = Next[j];
}
}
if (j == B->len) {
printf("Success!\n");
}
else
{
printf("Fail\n");
}
}
int main() {
PSTRING S = init();
PSTRING B = init();
Assign(S, "hello");
Assign(B, "el");
int* Next = GetNext(B);
KMP(S, B, Next);
return 0;
}