一.KMP有什么用
KMP主要应用在字符串匹配上。
比如我们从字符串"acfacfgded"(需要在哪里找的字符串称为“文本串”)找其中是否包含字符串"acfg"(需要从文本串里找的字符串我们叫做“模式串”),我们一般会想到的解法是暴力求解,两层for循环,依次对模式串的每一个元素进行匹配,如果匹配失败,下次还从模式串的第一个进行匹配,这就导致了较高的时间复杂度(O(n×m))。
而KMP算法不同之处就在于,当模式串的某个元素匹配失败后,不需要再从模式串的第一个元素从头开始匹配了,而是根据前缀表(next)找到模式串中一个最优的位置继续进行匹配。
二.什么是前缀表
什么是前缀:字符串的前缀是指从第一个元素开始的、不包括最后一个元素的连续字串。
什么是后缀:字符串的后缀是指不包括第一个元素的、以最后一个元素结尾的连续子串。
最长相等前后缀:字符串的最长相等前后缀就是字符串的前缀、后缀中相等的、最长的连续子串。
例如,对于字符串"acdac"。
还有一种形象一点的理解,就是你,将一个字符串固定不动,另外一个完全一样的字符串不断向右平移,直到两个字符串的交叉部分的元素相等,相等前后缀就是两