当比对每个字串时从右边开始匹配...
# <stdlib.h>
# <stdio.h>
# <.h>
/*Show usage*/
void usage(char * prog)
{
prf(\"Usage: %s text pattern\\n\", prog);
exit(123);
}
/*Get dist for \'a\' to \'z\'*/
void bm_dist(char * patt, patt_length, * dist)
{
char ch;
k;
for(ch = \'a\'; ch <= \'z\'; ch ) /*only \'a\' to \'z\' here*/
dist[ch-97] = patt_length;
for(k = 0; k <= patt_length -1; k )
dist[patt[k] - 97] = patt_length - k - 1;
prf(\"dist: \");
for(k = 0; k < 26; k )
prf(\"%d \", dist[k]);
prf(\"\\n\");
}
/*Algorithm*/
void bm_sm(char * patt, char * text, patt_length, text_length, * dist)
{
i, j, k;
i = patt_length - 1; /*Start from text[patt_length-1]*/
while(i < text_length)
{
j = patt_length - 1;
k = i;
while(j >= 0 && patt[j] text[k])
{
j --;
k --;
}
(j < 0)
{
prf(\"position %d\\n\", k + 1);
prf(\"text: %s\\n\", text);
prf(\"patn: \");
for(j = 1; j <= k +1; j )
prf(\" \");
prf(\"%s\\n\", patt);
;
}
{
i = i + dist[text[i] - 97] - patt_length + j + 1;
}
}
prf(\"Not match!\\n\");
}
( argc, char * argv)
{
char * text = NULL;
char * pattern = NULL;
dist[26];
/*Check arguments*/
(argc != 3)
usage(argv[0]);
{
text = argv[1];
pattern = argv[2];
}
prf(\"text: %s\\n\", text);
prf(\"patn: %s\\n\", pattern);
bm_dist(pattern, strlen(pattern), dist);
bm_sm(pattern, text, strlen(pattern), strlen(text), dist);
1;
}
最新评论