凑个字数
这篇分析了Kmp中next数组到底是用来干什么的。文章假定大家已经对字符串匹配算法具有初步了解。但是对kmp中的next不是很懂。如果想要研究更多。可以出门左转https://blog.youkuaiyun.com/qq_41105401/article/details/79827356这篇写的很详细。
补充个难点
为什么可以不考虑不是后缀的但跟开头能匹配的内容
学过kmp都知道,下面这个串。
目标串S:abdabab
xqweqwer
模式串T:abdabab
y
应该移动到如下
abdabab
xqweqwer
11111abdabab
y
而不是
abdabab
xqweqwer
111abdabab
y
我们发现中间那个小老弟ab
虽然跟前后缀一样但是移过去后发现它是个错误的位置。这是因为目标串中间的ab到末尾是abab,但模式串开头是abda,所以移动过去后发现它俩配不上,换言之,如果中间的ab是正确的位置,的充要条件就是中间中间的ab
到结尾应该等于模式串的开头。而这句话你在品品,ab到结尾是个啥,可不就是后缀吗。所以说这就证明了,如果奇迹有颜色一定是中国红,呸。如果有个🍢是正确的位置那它肯定是个跟前缀相等的后缀。所以这种前后缀是ab
中间还有ab
也不用担心,只管后缀就行了,因为中间那个ab如果是正确能跳转的位置,肯定会纳入后缀里面,如果没纳入,那就说明它不是。
数学逻辑
其实就是个逆否命题
因为:
if 那个位置是能匹配的位置 then 那个位置是前后缀
所以:
if 那个位置不是前后缀 then 那个位置不是能匹配的位置