第一次看KMP算法时,很懵逼,但感觉很牛逼,后面实训时,同学分配到这个算法,看了两天,看了不少文章,终于还是理解到了什么是KMP算法的精髓。
首先讲一些简单的概念。
为什么会出现KMP算法或者是他的优点是什么:
KMP算法是由三个大佬发现的,优点就是在BF朴素算法上进行优化,将o(m*n)的复杂度,通过对模式串对称性做表,
变成了o(m+n)。
重点next[]数组的实现
a b a b a a a b 模式串,当我们对其对称性做表时。
通过对最大重复项进行判断。(首先是人工判断)
a(-1)(首位默认为-1,不同的应用初始化不同,此处使用-1)
b(0)
a(1)开始出现重复项。
b(2)
a(3) 重点 :当前一位相同时,判断当前位是否有最长相同项,当有时aba仍然与前置aba匹配时。
会继承与上值next[2]+1
a(1)重点:当前值abaa不在与abab匹配时,这时候我们就开始了回溯,
当我们最后一位a与b不匹配时,我们就会使用到之前所定义好的匹配表。
此时next[5]的对称性就会小于next[4]的对称性,此时我们将模式串分开
abaa与abab 我们在ab之间不匹配,此时就回溯我们next[2]上表,继续进行判断
是否str[next[2]]与str[i]相等,不相等继续回溯,直到next[]返回值<=0时,停止回溯;(关于i值在代码中可见,因为未设置k值,暂时以str[next[2]]代表;当然在此表达的意思是当遇到不匹配时,列如ababaa 当到末尾a时
可以理解为abab 与abaa之间的匹配
这样k=next[k-1];此列中为k=next[2]是在a之后失配。(因为第一次写博客,前面没写好 这里强调一下)
回溯next[]值应该就是kmp算法中的精髓,如有错误,欢迎指正。:
代码如下;当前k值可对照。