基于后缀,应该算是Boyer-Moore算法的简化算法,详情——嗯——依然参阅《柔性字符串匹配》这本好书(因为我肯定没法讲得比他清楚)。
我的实现如下:
- template<class OutputFunctionType >
- size_t Search_Horspool(const char* Str, const char* T, OutputFunctionType out)
- //在Str中寻找T,返回T出现的总次数
- //使用 out 处理每个T出现的点
- {
- int dictionary[128]; // 移动表
- size_t occurence=0; // T 出现的次数
- int len_T=0; // T 的长度
- int len_S=0; // Str 的长度
- int i,j; // 会用到的...
- //初始化:
- for(i=0;T[i];++i)
- ;
- len_T=i;
- for(i=0;Str[i];++i)
- ;
- len_S=i;
- for(i=0; i<128; ++i)
- dictionary[i]=len_T;
- for(i=0; i<len_T ;++i){
- dictionary[T[i]] = len_T - i -1 ;
- }
- //匹配:
- for(i=0; i<len_S-len_T+1; ++i){
- for(j=len_T-1; j>=0; --j){
- if(T[j]!=Str[i+j]){
- i+=dictionary[T[j]];
- break;
- } else if(j==0) {
- OutputFunction(i);
- ++occurence;
- }
- }
- }
- return occurence;
- }