KMP算法的个人理解

网上关于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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值