【程序】
#include <stdio.h>
#include <string.h>
int table[27]; //前26个英文字母,最后一个空格
void ShifTable(char p[])//生成移动表
{
int i;
for(i=0;i<27;i++)
table[i]=strlen(p);
for(i=0;i<strlen(p)-1;i++) //最后一个字符不需要建立
table[p[i]-'a']=strlen(p)-i-1;
}
int Table(char t) //返回字符对应的移动距离
{
if(t!=' ')
return table[t-'a'];
else
return table[26];
}
int Horspool(char t[],char p[]) //Horspool算法
{
int i,k;
ShifTable(p);//建表
i=strlen(p)-1;
while(i<strlen(t))
{
k=0;
while(k<strlen(p)&&p[strlen(p)-1-k]==t[i-k])
k++;
if(k==strlen(p))
return i-strlen(p)+1;
else
i=i+Table(t[i]);
}
return -1;
}
int main()
{
int start;
char t[100],p[20];
printf("输入母串:");
gets(t);
printf("输入子串:");
gets(p);
start=Horspool(t,p);
if(start>=0)
printf("起始位置:%d\n",start+1);
else
printf("没有此串!\n");
}