#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef char sString;
void get_next(sString* T, int *next)
{
int i = 1, j = 0;
next[1] = 0;
while(i < T[0]){
if(j==0 || T[i]==T[j]){//若相等或者子串回到初始位置
++j;
++i;
if(T[i] != T[j])
next[i] = j; //前缀不同,则保存j
else
next[i] = next[j];//前缀相同,则保存j的上一个位置
}
else{
j = next[j];
}
}
}
//主串S 匹配串T
int Index_KMP(sString* S, sString* T, int pos)
{
int j = 1;//子串T下标
int i = pos;//主串S下标
int next[255];//存储下标
get_next(T, next);
while(i <= S[0] && j <= T[0]){
if(j == 0 || S[i] == T[j]){
//若子串回到原处或者成功匹配
++j;
++i;
printf("\ni = %d, j = %d\n", i , j);
}
else{
j = next[j];
}
}
printf("%d", T[0]);
if(j > T[0]){
//子串结束,匹配成功
return i - T[0];
}
else{
//主串结束,匹配失败
return -1;
}
}
int Index_BF(sString* S, sString* T, int pos)
{
int j = 1;//子串
int i = pos;//主串
int k = i;
while( k <= S[0]-T[0]+1 ){
while(j <= T[0] && S[i]==T[j]){
i++;
j++;
}
if(j > T[0]){//匹配成功
return i-T[0];
}else{
i = k + 1;
j = 1;
}
k = i;
}
return -1;
}
int main()
{
sString S[20];
sString T[20];
int pos;
int n;
int pos_BF;
int pos_KMP;
printf("1, BF模式匹配\n");
printf("2, KMP模式匹配\n");
printf("请选择模式:");
scanf("%d", &n);
if(n==1){
printf("请输入主串S:");
scanf("%s", S+1);
printf("请输入子串T: ");
scanf("%s", T+1);
S[0] = strlen(S+1);
T[0] = strlen(T+1);
printf("请输入从主串开始匹配的位置: ");
scanf("%d", &pos);
pos_BF = Index_BF(S, T, pos);
if(pos_BF == -1){
printf("匹配失败!\n");
}else{
printf("匹配位置结果为 position = %d\n", pos_BF);
printf("匹配成功!\n");
}
}else if(n==2){
printf("请输入主串S:");
scanf("%s", S+1);
printf("请输入子串T: ");
scanf("%s", T+1);
printf("请输入从主串开始匹配的位置: ");
scanf("%d", &pos);
S[0] = strlen(S+1);
T[0] = strlen(T+1);
pos_KMP = Index_KMP(S, T, pos);
if(pos_KMP == -1){
printf("匹配失败!\n");
}else{
printf("匹配位置结果为 position = %d\n", pos_KMP);
printf("匹配成功!\n");
}
}else{
printf("error data!!!\n");
}
}
KMP和BF模式匹配算法
最新推荐文章于 2024-09-12 13:19:42 发布