1957

无聊蛋疼的1957写的低端博客
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

horspool算法

Posted on 2013-05-29 14:38  1957  阅读(702)  评论(0编辑  收藏  举报

BM算法的简化版

后缀匹配。

若不匹配,那么跳转为主串最后一个字符在模式串中出现的最右位置,若没出现,那么直接跳转模式串的长度。

 

int horspool(char* T,char* P)
{
	int len_p = strlen(P);
	int len_t = strlen(T);
	int B[256] = {0};
	for(int i = 0 ; i < 256 ; i++) B[i] = len_p;
	for(int i = 0 ; i < len_p ; i++)
		B[P[i]] = len_p - i - 1;
	int pos = 0;
	while(pos <= len_t - len_p)
	{
		int j = len_p - 1;
		while(j >=0 && T[pos+j] == P[j]) j--;
		if(j < 0) return pos;
		pos = pos + B[T[pos+len_p]];
	}
	return -1;
}