用C实现串匹配的几种方法,kmp和BM

本文详细介绍了使用C语言实现的KMP和BM算法,提供了算法的源代码和工作原理说明。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本来不想自己写的,但网上的大都是c++实现的,有些自称是C实现的 复制到编译器上根本运行不了。
KMP还是很经典的算法,我就不加注释了,直接返回第几个数匹配..
#include <stdio.h>
#include <stdlib.h>
void getNext(char t[]);
int next[80];
int main()
{
char s[80],t[80];

int result=0;
printf("输入字符串:");
gets(s);
printf("输入字符串:");
gets(t);
getNext(t);
int i=0,j=0;
while(i<strlen(s)&&j<strlen(t))
{
if(s[i]==t[j]) {i++;j++;}
else
{
j=next[j];
if(j==-1) {i++;j++;}
}
}
if(j>=strlen(t)) result=i-j+1;
else result=0;
printf("%d/n",result);
}

getNext(char t[])
{

next[0]=-1;
int j=0,k=-1;
while(j<strlen(t))
{
if(k==-1||t[j]==t[k])
{
j++;
k++;
next[j]=k;
}
else k=next[k];
}
}
}

BM算法,网上实现的不多,有几个版本的都是很复杂,指针来指针去,其实没那么烦
#include <stdio.h>
#include <stdlib.h>
int BM(char s[],char t[],int n,int m);
int dist(char s,char t[]);
int main()
{
char s[80],t[80];
printf("输入字符串:");
gets(s);
printf("输入字符串:");
gets(t);

// printf("%s/n %s",s1,s2);
printf("%d",BM(s,t,strlen(s),strlen(t)));
}
int BM(char s[],char t[],int n,int m)
{
int i=m-1,j;
while(i<n)
{
j=m-1;
while(j>-1&&s[i]==t[j])
{
j--;
i--;
}
if(j==-1) return i+2;
else i=i+dist(s[i],t);
}
return 0;

}
int dist(char s,char t[])
{
int m=strlen(t);
int j=m-1;
for(j=m-1;j>-1;j--)
{
if(t[j]==s) break;
}
if(j==m-1||j==-1)return m;
else return m-j-1;
return 0;
}
BM(Boyer-Moore)算法是目前相当有效又容易理解的一种,一般情况下,比KMP算法快3-5倍。 BM算法采用从右向左比较 的方法,同时应用到了两种启发式规则,即坏字符规则 和好后缀规则 ,来决定向右跳跃的距离。

大家看着玩,多批评啊呵呵

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值