本文参考《大话数据结构》与青岛大学王卓老师的数据结构讲解视频结合自己的理解给出,如有不妥,欢迎大家交流。
王卓老师视频:https://www.bilibili.com/read/cv2306631?spm_id_from=333.788.b_636f6d6d656e74.227
这里说回溯可以不用发生,可以这样理解,即如果T字符串的前缀和后缀一致,则,直接回溯到j位置,即相当于对i进行了回溯。我们在后面可以发现,next[j]值均为前缀与后缀可相等的最大值,这样就保证了对于i来说可以,我可以在i不回溯的情况下得到i回溯时最先发生的情况。同样,如果next[j]位置也有next[next[j]] 位置,依次把i往前移动,即可得到所有可能情况。
next数组的计算可以理解为找T字符串前缀和后缀匹配的个数的过程。这样可以保证,每次回溯的均是i最先可能出现相等的情况。
这里主要注意,每次回溯到的位置是next[j],这里的j即可以理解为T字符串中的j,即它前面的字符串为目前1.。。。i这个字符串的前缀。
这里其实可以理解为,如果j位置和nextval[j]的值一致,如果S[i]与T[j]不匹配,则s[i]与T[nextval[j]]也不会匹配,所以其实是对next[i]值的修正。