GexNext(非暴力法)

第一部分 

 从这里可以得出

if (T[k] == T[j])
{
	k++;//k=next[j]
	next[++j] = k;
}

这里使k++,后面的计算可以通过再次利用k的值和T[k]=T[j]进行计算

第二部分 

如字模式串T=“abaababc”

j=7时,T[3]≠T[6],那就要找出T[0]到T[5]之间第二大子串

为什么不是第一大子串,如果找出T[0]到T[5]第一大子串,即T[0]T[1]T[2]=T[3]T[4]T[5],那这样又比较T[3]和T[6]之间地大小,死循环了。

而令k=next[k]的过程中,就能帮助找到第二大子串,为什么?其推断过程如下

∵T[0]...T[2]=T[3]...T[5] 即aba=aba

∴这里的next[k]=next[3]=1,T[2]...T[2]=T[5]...T[5],即a=a

又T[0]...T[0]=T[2]...T[2],即a=a

∴T[0]...T[0]=T[5]...T[5]

这就是上述代数式的具体意义

在得知T[0]等于T[5]的情况下,我们再判断T[1]是否等于T[6]

所以我们在第二步的推导中,就要将k=next[k]

这样才可以通过比较T[k]=T[j]来比较T[1]=T[6]

第三部分

 如果在k=next[k]的这个不断回溯的过程中,k=next[0]=-1时,说明T[0]到T[j-1]不存在真前缀和真后缀相等的子串,next[j+1]=0。

if(k==-1)
{
    next[++j]=0;
}

假设next[1]=0啊,那么下一步要通过T[k]=T[j]来计算next[2]的值,j已经变成2了,但是k是多少,所以我们就得记录下k的值,给后续的数字使用。那我们就可以比较T[0]和T[1]来计算next[2]

if(k==-1)
{
    next[++j]=0;
    k=0;
}

第四部分

一开始next[0]=-1,要计算next[1]时,k=next[0]=-1,所以初始化包括

next[0]=-1;k=-1 

void getNext(char T[], int next[])
{
	int j = 0, k = -1;
	while (T[j] != '\0')
	{
		if (k == -1)
		{
			next[++j] = 0;
			k = 0;
		}
		else if (T[j] = T[k])
		{
			k++;
			next[++j] = k;
		}
		else
			k = next[k];
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值