数据结构[C语言]next数组代码求解解析以及改进的next_val代码解析

 在了解如何手算next数组后,我们接下来用代码来解析next数组的求解过程:

首先给出代码:

​
void get_next(SString T, int* next)
{
	int i = 1;
	int j = 0;
	next[1] = 0;
	while (i < T[0])//T[0]里保存的是子串长度
	{
		if (j == 0 || T[i] == T[j])
		{
			++i; ++j;
			next[i] = j;
        }
		else
        {
			j = next[j];
	    }
    }
}

​
求子串T="abaabcac"的next数组
编号12345678
   Tabaabcac
next0       

当i=1时进入循环,满足j=0,        i=2,j=1,next[2]=1

求子串T="abaabcac"的next数组
编号12345678
   Tabaabcac
next01      

接着循环,此时不满足if条件语句,则进入else,j=next[1]=0,继续循环,满足j=0,

i=3,j=1,next[3]=1

求子串T="abaabcac"的next数组
编号12345678
   Tabaabcac
next011     

进入循环,此时满足if条件,T[1]==T[3]='a',i=2,j=4,next[4]=2

求子串T="abaabcac"的next数组
编号12345678
   Tabaabcac
next0112    

进入循环,不满足if,则j=next[j]=next[4]=2,再次进入循环,不满足if,j=next[j]=next[2]=1,在此进入循环,T[4]==T[1]='a',i=5,j=2,next[5]=2.

求子串T="abaabcac"的next数组
编号12345678
   Tabaabcac
next01122   

后续方法都与上相同,读者可以自己判断,最终的结果:

求子串T="abaabcac"的next数组
编号12345678
   Tabaabcac
next01122312

在了解普通next数组求解后,接下来给出改进后的next_val代码:

void get_next(SString T, int* next)
{
	int i = 1;
	int j = 0;
	next[1] = 0;
	while (i < T[0])//T[0]里保存的是子串长度
	{
		if (j == 0 || T[i] == T[j])
		{
			++i; ++j;
			if (T[i] != T[j])
				next[i] = j;
			else
				next[i] = next[j];
		}
		else
			j = next[j];
	}
}

相比之下,两个代码并没有多大区别,仅仅多了一个判断和赋值,

求子串T="abaabcac"的next数组
编号12345678
   Tabaabcac
next01122312
next_val01021302

根据代码,写出next_val,求解nextval数组是基于next数组的,模式串每一个字符和next数组值给出的下标的对应位置的数作比较,相等就取对应的next数组值作为当前位置字符的next-val值,不等就直接取当前位置字符的next数组的值作为next-val的值。

next-val数组第一个数直接为0,求解第二个b的next_val数组,看他的next为1,则把1作为下标,T[1]为‘a'!='b',则b的next-val值就直接取当前位置字符的next数组的值作为next-val的值,为1.

求解第三个a的next_val数组,看他的next为1,则把1作为下标,T[1]为‘a'='a',则相等就取对应的next数组值作为当前位置字符的next-val值,及第一个的next值为0.

后续求解都与上面方法相同,读者可以自己根据情况理解。

 

 

 

 

 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

pointer->指针

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

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

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

打赏作者

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

抵扣说明:

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

余额充值