数据与算法之美 2020-06-10
KMP看书是很难懂的......相信我,推荐一个易懂视频
https://www.bilibili.com/video/BV1jb411V78H?from=search&seid=9395428282072905815
1.为什么只用研究模式串?因为发生不匹配时,模式串当前下标之前的内容和被查找串的内容是相同的。
2.为什么移动方法不是下面的移动法1,而是移动法2?移动法1的思路是:既然原初不匹配情况下,当前位置之前有相同的前缀(黄色和红色),那么可以直接在开头跳过对红色部分的检索,因为黄色部分已经匹配了,红黄相同就可以直接跳过。
因为移动法1是在被查找串中查找模式串的一部分而已,而不是在被查找串里搜索模式串
3.上述的移动法2,不会跳过可能匹配的部分么?
之前我们说过,只用研究模式串,在原初不匹配情况下,当前位置之前的内容和被查找串对应部分是相同的。
那么就假设红色部分之前可能有匹配的部分吧,但是一个字符一个字符地移动串,会发现如果匹配的话,必须要和黄色部分相同才行,而和黄色部分相同的,也只有红色部分了。
4.为什么红色部分的末尾是挨着当前位置的(出现不匹配情况的下标)?
假设不是挨着的,如下图,从前往后找,找到一个和红色部分匹配的红色部分。
秉承红色的已经匹配了,那么黄色的就不用比较了的思想(黄色和红色相同),把黄色部分移到红色部分。
直接接着比较的话,就会有遗漏,而被遗漏的部分不一定和模式串相同
5.为什么要找最长的公共前缀?
因为如果找的不是最长前缀,那么可能跳过匹配的情况,比如下图直接找 黄色和红色做为公共前缀并且移动的话,就跳过了绿色的B,违背了
上述的 第3点 :移动过程中不能有和模式串开头相同的部分。