アルゴリズムのメモ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;
}