您的位置:首页 > 其它

KMP算法的个人理解

2018-03-01 13:59 190 查看
网上关于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.csdn.net/starstar1992/article/details/54913261
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  BMP算法