模式串的next()函数值

模式串:ababaaaba
next:011234223

方法:

  • 前两位是0和1
  • 第三位:前一位b对应的next值为1,1对应的a(在数组中第一个数为a)和b不相同,故第三位的next值为1
  • 第四位:前一位a对应的next值为1,1对应的a和a相同,故第四位的next是在前一位(第三位)的next上+1,为2
  • 第五位:前一位b对应的next值为2,2对应的b和b相同,故第五位的next是前一位(第四位)的next上+1,为3
  • 第六位:前一位a对应的next为3,3对应的a和a相同,故第六位的next是前一位(第五位)的next+1,为4
  • 第七位:前一位a对应的next为4,4对应的b和a不同,第4位的b的next值2所对应的b和a也不一样,第2位的b的next值1所对应的a和a相同,故第七位的next是滴2位的next值+1,为2
  • 第八位:前一位next值为2,2对应的b和a不一样,第二位的b的next值为1,1对应的a和a一样,故第八位的next值是第二位next+1,为2
  • 第九位:前一位next为2,对应的b和b相同,故第九位对应的next为第八位+1,为3

Practice:
模式串:TACATTATACAGTACT
next:0111122

  • 52
    点赞
  • 147
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
首先,KMP算法中的next函数用于匹配失败时进行跳转,nextval函数则是对于重复的最长前缀和最长后缀进行优化,以达到更快的匹配速度。 对于模式"abcdabcdab",它的next函数可以如下计算: 1. 首先,next[0] = -1,next[1] = 0; 2. 以i=2为例,模式中前缀"ab"和后缀"ab"完全匹配,因此next[2] = 1; 3. 以i=3为例,模式中前缀"abc"和后缀"abc"完全匹配,因此next[3] = 2; 4. 以i=4为例,模式中前缀"abcd"和后缀"abcd"完全匹配,因此next[4] = 3; 5. 以i=5为例,模式中前缀"abcda"和后缀"abcda"完全匹配,因此next[5] = 4; 6. 以i=6为例,模式中前缀"abcdab"和后缀"abcdab"完全匹配,因此next[6] = 5; 7. 以i=7为例,模式中前缀"abcdabc"和后缀"abcdabc"完全匹配,因此next[7] = 6; 8. 以i=8为例,模式中前缀"abcdabcd"和后缀"abcdabcd"完全匹配,因此next[8] = 7; 9. 以i=9为例,模式中前缀"abcdabcda"和后缀"abcdabcda"不完全匹配,但是可以通过next[8]跳转到next[7],即next[9] = next[8] + 1 = 8; 10. 以i=10为例,模式中前缀"abcdabcdab"和后缀"abcdabcdab"完全匹配,因此next[10] = 9。 因此,模式"abcdabcdab"的next函数为-1,0,1,2,3,4,5,6,7,8,9。 接下来,我们可以通过next函数来计算nextval函数: 1. 首先,nextval[0] = -1,nextval[1] = 0; 2. 对于i=2,因为next[i] = 1,所以nextval[i] = next[i] = 1; 3. 对于i=3,因为next[i] = 2,所以nextval[i] = next[i] = 2; 4. 对于i=4,因为next[i] = 3,所以nextval[i] = next[i] = 3; 5. 对于i=5,因为next[i] = 4,所以nextval[i] = next[i] = 4; 6. 对于i=6,因为next[i] = 5,所以nextval[i] = next[i] = 5; 7. 对于i=7,因为next[i] = 6,所以nextval[i] = next[i] = 6; 8. 对于i=8,因为next[i] = 7,所以nextval[i] = next[i] = 7; 9. 对于i=9,因为next[i] = 8,所以nextval[i] = next[next[i]] = next[8] = 7; 10. 对于i=10,因为next[i] = 9,所以nextval[i] = next[next[i]] = next[9] = 8。 因此,模式"abcdabcdab"的nextval函数为-1,0,1,2,3,4,5,6,7,8。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值