用c语言写Horspool(字符串匹配)算法

完整代码

#include <stdio.h>
int  table[26];
//初始化 移动表 
char init(char p[],int m)
{
	for(int i=0;i<26;i++)
	{
		table[i]=0;
	}

	for(char i='A';i<='Z';i=i+1)
	{
		for(int j=0;j<m;j++)
		{
			if(p[j]==i)
			{
				table[i-65]=m-j-1;
			}
		}
	}
	for(int i=0;i<26;i++)
	{
		if(table[i]==0)
		{
			table[i]=m;
		}
	}
}

char horspool(char t[],char p[],int n,int m)
{
	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
		{
			int a=t[i]-65;
			
			i= i+ table[a];
		}
	}
	return -1;
}
int main()
{
	char p[20];
	char t[100];
	int n,m;
	while(scanf("%d%d",&m,&n)&&m!=0&&n!=0)
	{
		getchar();
		for(int i=0;i<m;i++)
		{
			scanf("%c",&p[i]);
		}
		getchar();
		for(int i=0;i<n;i++)
		{
			scanf("%c",&t[i]);
		}
		init(p,m);
		
		printf("移动表为:"); 
		for(int i=0;i<26;i++)
		{
			printf("%d",table[i]);
		}
		printf("\n"); 
		int c =  horspool(t,p,n,m);
		if(c==-1)
		{
			printf("匹配失败");
		}
		else
		{
			printf("匹配成功且文本的初始位置为:%d",c);
		}
		
	}
	
	
}

发布了159 篇原创文章 · 获赞 36 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43342105/article/details/105447311