#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h> #define MAX_SIZE 255 // 定义字符串的最大长度 typedef unsigned char SString[MAX_SIZE]; //数组第一个保存长度
//BF
int BFMatch(char *s,char *p)
{
int i,j;
i=;
while(i < strlen(s))
{
j=;
while(s[i]==p[j]&&j < strlen(p))
{
i++;
j++;
}
if(j==strlen(p))
return i-strlen(p);
i=i-j+; //指针i回溯
}
return -;
}
//getNetx
void getNext(char *p,int *next)
{
int j,k;
next[]=-;
j=;
k=-;
while(j < strlen(p)-)
{
if(k==-||p[j]==p[k]) //匹配的情况下,p[j]==p[k]
{
j++;
k++;
next[j]=k;
}
else
{ //p[j]!=p[k]
k=next[k];
}
}
} //KMP
int KMPMatch(char *s,char *p)
{
int next[];
int i,j;
i=;
j=;
getNext(p,next);
while(i < strlen(s))
{
if(j==-||s[i]==p[j])
{
i++;
j++;
}
else
{
j=next[j]; //消除了指针i的回溯
}
if(j==strlen(p))
{
return i-strlen(p);
}
}
return -;
} int main()
{
int a, b;
char s[MAX_SIZE], p[MAX_SIZE]; printf("请输入模式串:");
scanf("%s", &s);
printf("请输入子串:");
scanf("%s", &p); a = BFMatch(s, p);
b = KMPMatch(s, p); if(a != -)
{
printf("使用BF算法:%d\n", a);
}
else
{
printf("未匹配\n");
} if(b != -)
{
printf("使用KMP算法:%d\n", a);
}
else
{
printf("未匹配\n");
} system("pause");
}
请输入模式串:lalalalalaaaa
请输入子串:lalaa
使用BF算法:
使用KMP算法:
请按任意键继续. . .