【串】朴素的模式匹配算法之:对i=i-j+2的理解

 说明:本文只是探讨对串这一数据结构中朴素模式匹配算法的实现中,i=i-j+2这一步的逻辑由来,仅为拙见,本人才疏学浅,也不会写文,只是学习中对这一步骤深有疑虑所以尝试用大话描述一下。欢迎批评,欢迎交流。希望能对学习的同好也略有帮助!

朴素模式匹配的实现代码:

        此代码摘编自作者程杰的《大话数据结构》第五章第6节

//S[0] == S.length
//T[0] == T.length
int Index(String S,String T,int pos)
{
	int i = pos; //i是指向S串的指针
			     //pos是指定开始查询的起始位置
	int j = 1;   //j是指向T串的指针

	//要求指针i不能超出串S的长度,即i≤S[0]
	//and 指针j不能超出串T的长度,即j≤T[0]
	while(i<=S[0] && j<=T[0])
	{
		//如果当下指针i和j指向的串字符相等,
		//就同时+1比较下一个位置
		if(S[i]==T[i])
		{
			++i;++j;
		}
		//否则,S串指针需要移动到一个特殊位置
		//T串指针只需移到首元素即可
		else
		{
			i = i-j+2;//※本文的主要探讨目标
			j = 1;
		}
	}
    //...还有一点结尾,但是不在讨论范围内
}

i=i-j+2 :

        实话实说,我看不懂,我大为震撼!但是好在我会度一下,粗略的看了一下一些博客,发现对其变形后更容易理解,因为这一结果应该也是分析后的浓缩!

i=(i-(j-1))+1

  1. (j-1)可以理解为:模式串已经和主串匹配的字符个数。
  2.  程序的目标:使得当前指针i的位置想要回溯到开始时i的位置的下一位。
  3.  先来说说(j-1)的逻辑:
    1. 已知:当前指针i的位置;
    2. 已知:匹配移动了多少个字符;

            可求:指针i移动前的起始位置        
            比如说起始位置是1,已经匹配成功了3个字符,那现在指针i是不是指向了4,1+3=4,对吧?

            那现在知道位置是4了,也知道匹配成功3个了,那是不是能反过去求起始位置1了? 所以i-(j-1)干的就是这么个事!

        4.  最后加一是怎么一回事呢?想想我们的目标是啥,是不是要到下一位去,那可不得加1嘛。

总结梳理:

              

 

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值