アルゴリズムのメモ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;
} 
公開された11元の記事 ウォンの賞賛1 ビュー1282

おすすめ

転載: blog.csdn.net/superman_lile/article/details/105393353