马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 ~风介~ 于 2014-5-23 16:37 编辑
先贴代码,晚一点出详解~ ^_^
BF算法比较简单上一张图:
#include<stdio.h>
#include<string.h>
#define MAXSTRLEN 255
typedef unsigned char SString[MAXSTRLEN];
int BF_Match(SString s,SString t)
{
int i=0,j=0;
int n=strlen(s),m=strlen(t);
while((i<n)&&(j<m))
{
if(s[i]==t[j]) /*匹配成功后,继续下一轮匹配,最后匹配成功后,i和j还要加一,然后跳出循环*/
{
i++;
j++;
}
else /*匹配失败,i回溯j置零,下一趟匹配*/
{
i = i-j+1;
j=0;
}
}
if(j==m)/*如果匹配成功的话,返回匹配成功的第一个位置*/
return (i-m);
else
return -1;
}
int main()
{
SString s,t;
int i;
printf("请输入主串s:");
scanf("%s",s);
printf("请输入模式串t:");
scanf("%s",t);
i = BF_Match(s,t);
if(i!= -1)
{
printf("模式串在主串中第一次出现的下标为:%d\n",i);
}
else
{
printf("主串中不存在模式串!\n");
}
return 0;
}
BM算法#include<stdio.h>
#include<string.h>
#define MAXSTRLEN 255
typedef unsigned char SString[MAXSTRLEN];
int BM(SString S,SString T)
{
int lenS,lenT,i,j;
lenS=strlen(S);
lenT=strlen(T);
for(i=0;i<=lenS-lenT;i++)/*当主串的字符小于模式串t时停止*/
{
if(T[0]==S[i]&&T[lenT-1]==S[i+lenT-1])/*比较第一个和最后一个字符*/
{
for(j=1;j<lenT-1;j++)/*比较*/
{
if(T[j]!=S[j+1])
break;
}
if(j==lenT-1) return i+1;
}
}
return 0;
}
int main()
{
int i;
SString S,T;
printf("请输入主串S:");
scanf("%s",S);
printf("请输入模式串T:");
scanf("%s",T);
i=BM(S,T);
if(i==0)
printf("主串中不存在模式串!\n");
else
printf("模式串在主串中第一次出现的下标为%d\n",i);
return 0;
}
KMP算法#include<stdio.h>
#include<string.h>
#define MAXSTRLEN 255
typedef unsigned char SString[MAXSTRLEN];
void get_next(SString T, int next[])
{
int lenT,i=1,j=0;
lenT=strlen(T);
next[1]=0;
while(i<lenT)
{
if(j==0 || T[i-1]==T[j-1])
{++i; ++j; next[i]=j;}
else
j=next[j];
}
printf("模式串T的next函数值为:");
for(i=1;i<=lenT;i++)
printf("%d ",next[i]);
printf("\n");
}
int KMP(SString S, SString T)
{
int next[MAXSTRLEN];
int lenS,lenT,i=1,j=1;
lenS=strlen(S);
lenT=strlen(T);
get_next(T,next);
while(i<=lenS && j<=lenT)
{
if(j==0 || S[i-1]==T[j-1])
{++i; ++j;}
else
j=next[j];
}
if(j>lenT) return i-lenT;
else return 0;
}
int main()
{
SString S,T;
int i;
printf("请输入主串S:");
scanf("%s",S);
printf("请输入模式串T:");
scanf("%s",T);
i=KMP(S,T);
if(i==0)
printf("主串中不存在模式串!\n");
else
printf("模式串在主串中第一次出现的下标为%d\n",i);
return 0;
}
|