串的BF算法

一、代码如下

/*
项目名称:串的模式匹配算法
编译环境:VC++ 2008
作者相关:。。。
最后修改:2019.10.11
学习目标:1.BF算法
注意事项:1.测试所有功能是否正常
*/

#include <stdio.h>
#include <string.h>

#define  ERROR    0
#define  OK       1

#define  MAXSTRLEN 255

typedef  bool   Status;

typedef  unsigned char String[MAXSTRLEN+1];//0号单元存放串的长度

Status StrAssign(String &T,char *s);

int    BF_Index(String S,String T,int pos);

Status StrOut(String S);

int main()
{
	char chars1[]="123abcdef";
	char chars2[]="abc";

	String S,T;
	StrAssign(S,chars1);
	StrAssign(T,chars2);
	printf("S");
	StrOut(S);
	printf("T");
	StrOut(T);
	printf("BF算法:");
	int location=BF_Index(S,T,2);
	if(!location)
		printf("在S串中没有T串\n\n");
	else
		printf("T串在S串pos后的下标为%d\n\n",location);

	return 0;
}

Status StrAssign(String &T,char *s)
{
	int i;
	if(strlen(s)>MAXSTRLEN)
		return ERROR;
	else
	{
		T[0]=strlen(s);
		for(int i=0;i<T[0];i++)
			T[i+1]=s[i];

		return OK;
	}

}

//返回T串在S串中第pos个字符之后的位置 
int BF_Index(String S,String T,int pos)
{
	int i=pos,j=1;
	while(i<=S[0]&&j<=T[0])
	{
		if(S[i]==T[j])
		{
			++i;
			++j;
		}
		else
		{
			i=i-j+2;//1.未比较完情况下,假设成功比较了n次,第n+1次失败了;
			j=1;    //2.那么i=pos+n,j=1+n;
			        //3.要使i=pos+1,那么需i-j+2;			
		}
	}
	if(j>T[0]) //比较后字符全相等
		return i-T[0];//返回比较的起始下标
}

Status StrOut(String S)
{
	printf("串内容: ");
	for(int i=1;i<=S[0];i++)
	{
		printf("%c",S[i]);
	}
	printf("\n\n");
	return OK;
}

二、结果

发布了62 篇原创文章 · 获赞 9 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Sruggle/article/details/102506151