在学习严奶奶的数据结构时,看到了关于KMP算法的推导过程,而在我重新开始走三位大神走过的道路时,遇到了很多的问题。这些问题在看了许多文章和视频后,并没有很好的解决,总觉得有一些疏漏的地方,所以我的理解写下来与大家分享,若有错误的地方请不留余地的指出来,不胜感激。
虽然可以有更好的方式来学会KMP,但我想如果可以的话,踩着巨人的脚步,想着当时他们是如何想到并逐步解决问题,或许会对我有很大的帮助。如何用数学来解决实际问题。接下来会是一堆符号与文字。
那现在开始,首先把书上的定义写出来。
主串为"",模式串为""。
一、 当主串中第i个字符与模式中的第j个字符“失配”时,主串中第i个字符应与模式串中哪个字符再比较?
假设:应与第k个字符,则前面的k-1个字符须满足
""="" (1-1)
而在这里就是我疑惑的起点
这个式子的意思我是这样理解的:我们假若t从1移动到k,共移动了k-1个字符,t现在的位置为k,s所在的位置为i,我们可以得到
① t 现在的位置 k 减去移动的k-1个字符就又回到了起点1
② 若s所在的位置 i 减去 k 所移动的k-1个字符 i-(k-1),则代表s回到与t首字符相对应的位置,(这里的回到并不是回溯),然后模式串k 之前的字符一一与主串 i 之前的k-1个字符相等。
而已经得到的"部分匹配"的结果是
(1-2)
(这个真的是阻挠了我很久,最后我是这样理解的,也不知道对不对。)
我们列出如下字符串
a b a b c a b c a c ---> i 主串
a b c a c ---> j 模式串 这是j与i “失配”所在的串
a b c a c ---> k