网上关于KMP算法的详解很多,也有很多人力争做到简洁解释。我就写写我的心得理解吧,很短,应该很易懂
首先来看一个反例:
总串 : a b c a b c a b d e f g
子串 : a b c a b d
总串前5位是abcab,和子串前5位相同,但比较第6位时,不一样。
这时我们错误的想一下,抛弃掉总串中被比较过的(即前5位),从总串第6位和子串的第1位比较,不一样,抛弃第6位;总串第7位和子串第一位比较,很明显,当比较到总串第9位和子串第3位时,不一样,so?我们能说总串里不含有子串么??
那么问题出在哪呢??
原因就在,总串被比较过的部分,不能直接被!丢!弃!
就拿被比较的前5位来说,开头是ab,结尾也是ab,你咋不知道结尾的ab是你要找的子串的头呢??
所以相比于直接抛弃前5位,我们应该往前返两位(ab的长度)
所以,KMP算法就是这样的!!!
方便起见,我们先求出子串分别被比较1~6位时,前后部分相同的长度
比方说"a"是0,“ab”是0,“abc”是0,“abca”是1,“abcab”是2,“abcabd”是0
依次存储到next[1]~next[6]
这样在与总串的比较过程中,就拿文章一开时的反例来说,前5位是相同的,第6位不一致,这时候总串首位向后移 (5-next[5]) 位,即1+(5-2)=第4位
KMP思路便是这样,理解后代码便很容易写出,可能求next数组会麻烦一点
代码可以百度,推荐博客:http://blog.youkuaiyun.com/starstar1992/article/details/54913261