KMP算法NEXT数组纯手工生成

用一个实际的例子来说明,经历了看懂,看不懂,看懂,看不懂,看懂...后我终于决定把它记下来了。

例子字符串为:abaabaca

首先可以肯定,第一个位置永远位0,第二个位置永远为1.那么可以初始化如下表格:

abaabaca
01      
然后求上表中红色的a多对应的值:公式为(a前面的字符串中所有前缀字符与a前面的字符串中所有后缀自付中所有后缀字符相同的字符的最大中长度最长的长度)+1;

公式看起来很复杂,一步一步来说明:

首先是前缀字符和后缀字符,拿字符abcde来举例:

前缀字符有:a、ab、abc、abcd ;后缀字符有:e、de、cde、bcde;

由此可见前缀字符就是第一个字符、(第一个字符第二个字符)、... 、(第一个字符...第n-1个字符)

               后缀字符就是第n个字符、(第n-1个字符第n个字符)、... 、 (第二个字符...第n个字符)

在abcde中,前缀字符与后缀字符没有相同的字符串存在,所以最大的相同字符串的长度位0;

在回到上表中的红色的a,它前面的字符串为  ab  ;ab的前缀字符有 {a} ;后缀字符有{b},最大的相同字符串的长度为0,

根据公式,上表中红色的a对应的位置应当填入0+1=1;获得下表:

abaabaca
011     
下面求上表中红色a位置的值

 上表中红色a前面的字符串为 aba; 它的前缀字符串有 {a ,ab};后缀字符串有{a,ba};最大的相同字符串的长度为1(都有相同的元素a),根据公式,上表中红色的a对应的位置应当填入1+1=2;获得下表:

abaabaca
0112    
然后求上表中红色b位置的值

上表中红色b前面的字符串为 abaa;它的前缀字符串有{a , ab,aba};后缀字符串有{a,aa,baa};最大的相同字符串的长度为1(都有相同的元素a),根据公式,上表中红色的b对应的位置应当填入1+1=2;获得下表:

abaabaca
01122   
然后求上表中红色a位置的值

上表中红色a前面的字符串为 abaab;它的前缀字符串有{a,ab,aba,abaa};后缀字符串有{b,ab,aab,baab};最大的相同字符串的长度为2(都有相同的元素ab),根据公式,上表中红色a对应的位置应当填入2+1=3;获得下表:

abaabaca
011223  
然后求上表中红色c位置的值

上表中红色c前面的字符串为abaaba;它的前缀字符串有{a,ab,aba,abaa,abaab};后缀字符串有{a,ba,aba,aaba,baaba};最大的相同字符串的长度为3(都用相同的元素aba),根据公式,上表中红色a对应的位置应当填入3+1=4;获得下表:

abaabaca
0112234 
最后就是求上表中红色的a的值了,自己试试吧,答案选中下面的表格得见:

abaabaca
01122341


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值