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

本来不想自己写的,但网上的大都是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算法采用从右向左比较 的方法,同时应用到了两种启发式规则,即坏字符规则 和好后缀规则 ,来决定向右跳跃的距离。

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值