算法笔记之hoorspool算法
从右往左进行字符扫描,如果所有匹配成功,则找到了匹配的字串,如果遇到不匹配的时候,就需要将模式右移动,这个时候考虑的是文本与模式最后一个字符对齐的文本字符C
-
当字符不在模式中
…C…
BARBER 向右移动模式m位当前面m-1个字符不包含最后一个字符时,移动m位
-
当字符在模式中
既前面m-1个字符中有和c匹配的字符
…C…(c在模式中出现多次)
CACBAB 移动模式将前m-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;
}