KMP学习笔记

kmp妙就妙在运用了旧的信息来加速新的匹配
原理:
匹配串:abababababab
模式串:abababab
匹配到第五位a的时候不匹配
此时回退到第三位比较可以节省移动两次比较的时间
其实刚才的移位法则就是对于模式串的每个前缀而言,用 kmp 数组记录到它为止的模式串前缀的真前缀和真后缀最大相同的位置
匹配时
s1 为匹配串, s2为模式串
j = -1(模式串位)
(j表示s1[i - 1]最多匹配到哪一位,所以处理到i时只需判断s1[i]与s2[j + 1]即可以知道i最多匹配到哪一位)
i 为 当前位
若s1[i]与s2[j + 1]不等,模式串一直回滚
若相等则模式串位加加
如果匹配完成则输出,模式串位回滚(方便匹配更多的位置)
(若一直不相等,是没有进入任何一个判断和循环的,所以相当于i++)

处理next数组
初始化j = -1,next[0] = -1 因为到它为止没有真前缀和真后缀
用 next 数组记录到它为止的模式串前缀的真前缀和真后缀最大相同的位置
相当于自己的前缀充当匹配串和自己来充当模式串
(?)
(因为匹配时最后的j是当前匹配到的位置,而自己不就是模式串吗!所以next[i]=j即可初始化next数组)

posted @ 2020-11-08 16:29  大W  阅读(68)  评论(0)    收藏  举报