源码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MaxLen 255
typedef struct {
char ch[MaxLen];
int length;
}SString;
int BF(SString S, SString T, int pos) {
int i = pos;
int j = 0;
while (i < S.length && j < T.length) {
if (S.ch[i] == T.ch[j]) {
i++;
j++;
}
else{
i = i-j+1;
j = 0;
}
}
if (j > T.length - 1) return i-T.length + 1;
else return 0;
}
void getNext(SString T, int next[]) {
int i = 1, j = 0;
next[1] = 0;
while (i < T.length) {
if(j == 0 || T.ch[i] == T.ch[j]) {
++i;
++j;
next[i] = j;
}
else j = next[j];
}
}
int KMP(SString S, SString T, int pos) {
int i = pos;
int j = 0;
int next[MaxLen];
getNext(T, next);
while (i < S.length && j < T.length) {
if (j == 0 || S.ch[i] == T.ch[j]) {
i++;
j++;
} else j = next[j];
}
if (j > T.length - 1) return i-T.length + 1;
else return 0;
}
void judgeResult(int result) {
if (result == 0) printf("匹配失败!\n");
else {
printf("匹配成功!\n");
printf("匹配结果为:%d\n", result);
}
}
int main() {
SString S, T;
printf("请输入主串:\n");
scanf("%s", S.ch);
printf("请输入子串:\n");
scanf("%s", T.ch);
S.length = strlen(S.ch);
T.length = strlen(T.ch);
int result;
int choose;
int pos;
while (1) {
printf("******************************\n");
printf("请选择:\n");
printf("1.BF算法\n");
printf("2.KMP算法\n");
printf("0.退出\n");
printf("******************************\n");
scanf("%d", &choose);
switch (choose) {
case 0:
exit(0);
break;
case 1:
printf("正在使用BF算法\n");
printf("请输入要从主串哪里开始匹配(从0号位置算起):\n");
scanf("%d", &pos);
result = BF(S, T, pos);
judgeResult(result);
break;
case 2:
printf("正在使用KMP算法\n");
printf("请输入要从主串哪里开始匹配(从0号位置算起):\n");
scanf("%d", &pos);
result = KMP(S, T, pos);
judgeResult(result);
break;
default:
printf("输入错误,请重新输入!\n");
break;
}
}
return 0;
}