串的模式匹配BF算法C/C++代码实现

本文介绍了串的BF算法,该算法是一种简单的模式匹配方法,通过逐一匹配和回溯来寻找子串。文章提供了C/C++代码实现,并展示了运行结果。

串:

串是一种内容受限的线性表。
与线性表基本操作不同的是,串是以“串的整体”作为操作对象的。

考虑到存储效率和算法的方便性, 串多采用顺序存储结构。

BF算法:

算法思想简明,从始位置开始逐一匹配,匹配成功继续下一个,若失败则回溯:
主串的指针i总是回溯到 i-j+2 位置,
模式串的指针总是恢复到首字符位置 j= 1
在这里插入图片描述

代码如下:

( 为了方便说明问题,算法描述当中所用到的顺序存储的字符串都是从下标为1的数组分量开始存储的, 下标为0的分量闲置不用)

#include<stdio.h>

#define MAXLEN 255

//串的顺序存储
typedef struct
{
	char ch[MAXLEN + 1];	//0号不用,从1开始
	int length;				//串的当前长度
}SString;

//BF算法
//返回模式T在主串s中第pos个字符开始第一次出现的位置。若不存在, 则返回值为0 
int Index_BF(SString S, SString T, int pos)
{
	int i = pos;	//主串起始位置
	int j = 1;		//模式串起始位置

	while (i<=S.length && j<=T.length)
	{
		if (S.ch[i] == T.ch[j])	//若相等 主串子串都往后移一位
		{
			++i;
			++j;
		}
		else					//不相等 主串回溯到i - j + 2,子串从头再来
		{
			i = i - j + 2;
			j = 1;
		}
	}
	if (j > T.length) return i - T.length;	//匹配成功
	else return 0;							//匹配失败
}


int main()
{
	SString S, T;
	S.ch[0]='#';	//0号不用,从1开始
	T.ch[0]='#';

	//输入
	printf("请输入主串S的长度:");
	scanf("%d", &S.length);
	printf("请输入主串S:");
	scanf("%s", (S.ch)+1);	//0号不用,从1开始

	printf("请输入子串T的长度:");
	scanf("%d", &T.length);
	printf("请输入子串T:");
	scanf("%s", (T.ch) + 1);	//0号不用,从1开始

	//输出
	printf("\nS:");
	for (int i = 1; i <= S.length;i++)
	{
		printf("%c", S.ch[i]);
	}	
	printf("\nT:");
	for (int i = 1; i <= T.length; i++)
	{
		printf("%c", T.ch[i]);
		
	}
	int index=Index_BF(S, T, 1);
	printf("\n你要查找的位置为:%d\n",index);
}

运行结果:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值