BF算法
#include <stdio.h>
#include<malloc.h>
#define maxsize 100
typedef struct string {
char str[maxsize];
int length;
}string;
void insert(string *s,string *p) {
int size_s = 0, size_p = 0;
printf("请输入主串元素的个数!\n");
scanf_s("%d", &size_s);
s->length = size_s;
printf("请输入主串元素!\n");
scanf_s("%s", s->str, maxsize);
printf("请输入模式串元素的个数!\n");
scanf_s("%d", &size_p);
p->length = size_p;
printf("请输入模式主串元素!\n");
scanf_s("%s", p->str, maxsize);
}
void match(string* s, string* p) {
int i = 0, j = 0;
while (i < s->length && j < p->length) {
if (s->str[i] == p->str[j]) {
i++;
j++;
}
else {
i++;
j = 0;
}
}
if (j == p->length){
printf("匹配成功,位置为:%d\n",i-j);
}
else {
printf("匹配不成功!\n");
}
}
int main() {
string s;
string p;
insert(&s, &p);
match(&s, &p);
}
KMP算法
#include <stdio.h>
#include<malloc.h>
#define maxsize 100
typedef struct string {
char str[maxsize];
int length;
}string;
void insert(string *s,string *p) {
int size_s = 0, size_p = 0;
printf("请输入主串元素的个数!\n");
scanf_s("%d", &size_s);
s->length = size_s;
printf("请输入主串元素!\n");
scanf_s("%s", s->str, maxsize);
printf("请输入模式串元素的个数!\n");
scanf_s("%d", &size_p);
p->length = size_p;
printf("请输入模式主串元素!\n");
scanf_s("%s", p->str, maxsize);
}
//next
int* getnext(string* p) {
int* next = (int*)malloc(sizeof(int) * (p->length));
int i = 0, j = -1;
next[0] = -1;
while (i < p->length-1) {
if (j == -1 || p->str[i] == p->str[j]) {
i++;
j++;
next[i] = j;
}
else {
j = next[j];
}
}
return next;
}
//nextval
int* getnextval(string* p, int* next) {
int* nextval = (int*)malloc(sizeof(int) * (p->length));
int i = 0;
nextval[0] = -1;
while (i < p->length - 1) {
if (p->str[++i] == p->str[next[i]]) {
nextval[i] = nextval[next[i]];
}
else {
nextval[i] = next[i];
}
}
return nextval;
}
void match(string* s, string* p, int* next) {
int i = 0, j = 0;
while (i < s->length && j < p->length) {
if (j == -1 || s->str[i] == p->str[j]) {
i++;
j++;
}
else {
j = next[j];
}
}
if (j == p->length) {
printf("匹配成功,位置为:%d\n",i-j);
}
else {
printf("匹配失败!\n");
}
}
int main() {
string s;
string p;
insert(&s, &p);
int* next = getnext(&p);
int* nextval = getnextval(&p, next);
match(&s, &p, nextval);
}