4.3串的模式匹配算法(BF算法)

66 篇文章 37 订阅
65 篇文章 2 订阅

4.3.1 求子串位置的定位函数Index(S,T,pos)

子串的定位操作通常称做串的模式匹配(其中T称为模式串),采用定长顺序存储结构,可以写出不依赖于其他串操作的匹配算法。

算法4.5:

下面是书中的伪代码:

int Index(SString S, SString T, int pos) 
{ 
	// 返回子串T在主串S中第pos个字符之后的位置。
	// 若不存在,则函数值为0。
	// 其中,T非空,1≤pos≤StrLength(S)。
	int i = pos;
	int j = 1;
	while (i <= S[0] && j <= T[0]) 
	{
		if (S[i] == T[j]) // 继续比较后继字符
		{  
			++i;
			++j;
		}
		else // 指针后退重新开始匹配 
		{
			i = i - j + 2;
			j = 1;
		}
	}
	if (j > T[0]) 
		return i - T[0];
	else 
		return 0;
} // Index



下面分析下:

这里先说明下,这个S[0],T[0]这个地方存储了整个串的大小。

这个代码的巧妙之处在于i=i-j+2和j=1这个地方,这个i=j-j+2,可以让i进行后移,也就是S后移,这里j=1,的意思如下:举个例子,当T中是ABC,而S是ABABABC,pos为1,那么j=1的作用就是清理,什么叫清理,意思就是当发现S中只有前两个字母相似,而没有第三个,这时重新计数。当然i也要进行回溯。


下面这张图,提现了这个过程(T='abcac'和主串S,pos=1)


这节就到这,下一节讲解数据结构里面的第一个难点:

KMP算法!



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT1995

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值