1.求NEXTS数组
?NEXTS数组中存放的是最长前缀的结尾
A.前面没有字符串,默认为-1
B.前缀不能要最后一个字符且 后缀不能要第一个字符,规定为0
C.剩下点按照:前缀长度和后缀长度的最大匹配
2.nexts[]中的前缀长度和后缀长度的匹配问题
A.前缀是从前向后数不包含最后一个,后缀从后向前数不包含第一个
B.前缀最大长度不能包含最后该串的最后一个字符,后缀最大长度不能包含该串的第一个字符,否则就是自己和自己相等
3.为什么[j4,j3] == [i1,i]?
i和j代表失配的位置,j2的代表最长后缀的开头,j3代表最长后缀的的结尾
[i1,i] == [j2,j]是因为在x和y才失配,x和y之前所有都是相等的。而[j4,j3] == [j2,j],这是根据nexts[]求法是:前缀长度和后缀长度的最大匹配。根据传递性则‘<==>’两块区域是相等。
4.当失配时,为什么要从J—>J3/J=nexts[J];?
首先nexts[]中存放的是最长前缀的结尾,在该例子中nexts[J] == J3
假设将J–>J4 &&I–>I1,由于[j4,j3 ]== [i1,i](上个问题已证),那么就可以从J4–>J3 && i1–>i,这样就是i不动,将J—>J3
5.在BF算法中,主串后移一位,子串归0,那么在KMP中可以让子串归0么?
可以让子串归0
KMP中J–>J3&&I不动,要让子串归0即I–>I1,那么将J–>J4即可
6.为什么在KMP算法中可以加速匹配的速度?
BF中,主串后移1个位置,子串归0
KMP中可以让子串归0(5中已经证明),那么主串就移动到了i1
在BF中主串后移了1个位置,KMP中子串后移了[0,i1]
7.为什么在求nexts[]时,要前缀长度和后缀长度的最大匹配?
(J-J2)越大,(i-i1)就越大,也就是i1离str1开头的位置越近,这样就不会错过可能匹配上的点
8.getNexts与KMP的比较
相同:KMP的本质是尽可能多的匹配字符,getNexts的本质是让前缀和后缀尽可能的长
不同:KMP是两个串,getNexts是一个串,可以将getNexts中的串看成两个串
?由于二者本质相同所以代码相同