Horspool算法
若文本 S = “FAILUREEISATHEBMOTHERCCFDSUCCESS”,模式P = “SUCCE”,利用Horspool算法给出完整过程。
#include<stdio.h>
#include<string.h>
void setTable(int T[], char s[], char p[])
{
for (int i = 0; i < 26; i++)
T[i] = strlen(p);
for (int i = 0; i < strlen(p);i++)
{
if (i != strlen(p) - 1)
{
int a1 = p[i] - 65;
T[a1] = strlen(p) - i - 1;
}
else
{
int a1 = p[i] - 65;
T[a1] = strlen(p) ;
}
}
}
int horspool(char s[], char p[],int T[])
{
int flags = strlen(p) - 1; //代表指向S中的位置
printf("%d ", flags);
while (flags<=strlen(s))
{
int k = 0;
for (int j = strlen(p)-1; j > 0; j--)
{
if (s[flags - k] != p[j])
{
flags += T[s[flags] - 65];
printf("%d ", flags);
break;
}
else
{
k++;
}
if (j <= 1)
return flags-4;
}
}
}
int main()
{
char s[] = "FAILUREEISATHEBMOTHERCCFDSUCCESS";
char p[] = "SUCCE";
int T[26];
setTable(T, s, p);
printf("所得的表为:\n");
for (int i = 0; i < 26; i++)
printf("%c ", i+65);
printf("\n");
for (int i = 0; i < 26; i++)
printf("%d ", T[i]);
printf("\n");
printf("s中flag变化过程:");
int L = horspool(s, p,T);
printf("\n");
printf("匹配成功时S串中首位置: ");
printf("%d", L);
printf("\n");
return 0;
}