算法笔记之hoorspool算法

算法笔记之hoorspool算法

从右往左进行字符扫描,如果所有匹配成功,则找到了匹配的字串,如果遇到不匹配的时候,就需要将模式右移动,这个时候考虑的是文本与模式最后一个字符对齐的文本字符C

  1. 当字符不在模式中
    …C…
    BARBER 向右移动模式m位

    当前面m-1个字符不包含最后一个字符时,移动m位

  2. 当字符在模式中

    既前面m-1个字符中有和c匹配的字符
    …C…(c在模式中出现多次)
    CACBAB 移动模式将前m-1个字符中最右边的 该字符与文本的该字符对齐


    1. t© = -. 模式串中最右字符c与模式串右端的距离 其它情况
      ​ -. 模式串的长度m,(前m-1个不含c)

    移动表中记录的是为了将模式对应字符对齐文本,我们需要移动的元素个数,BAOBAB的移动表如下:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 1000
int hoorspool(char *t,char *p)
{
	int n=strlen(t);
	int m=strlen(p);
	int table[MAX];//将表中所有原数置为模式长度m
	for(int i=0;i<MAX;i++){ 
	    table[i]=m;
	}
	for(int i=0;i<m;i++){//模式中的字符设另为与模式最右端的距离
	    table[p[i]]=m-1-i;
	}
	int i=m-1;
	while(i<=n-1){ //进行匹配
		int k=0;
		while(k<m&&(p[m-1-k]==t[i-k])){
			k++;
		}
		if(k==m)
		    return i-m+1;
		else
		    i=i+table[t[i]];
	}
	return -1;
}
int main()
{
	 char t[MAX],p[MAX];
	 scanf("%s%s",t,p);
	 int x=hoorspool(t,p);
	 if(x==-1)
	     printf("Not find!");
	 else
	     printf("location:%d",x);
     return 0;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值