3遍才理解了差不多,还有一句话之前留言的还是木有理解,BM是去滑动主串,KMP是利用模式串的好前缀规则去跳过模式串(相当于滑动模式串)主串递增的形式。最难理解的就是next数组中的求解,如果b[0,i-1]的最长前缀是k-1 那b[0,k-1]就是最长的前缀 这里开始分两种情况,
第一种情况:b[0,k-1]的下一个字符b[k]=b[i],则最长前缀子串就变成b[0,k],最长后缀就变成b[i-k,i]。next[i]=next[i-1]+1
第二种情况:b[0,k-1]的下一个字符b[k]≠b[i],这时候我们要去寻找的就是b[0,i-1]中的最长前缀子串(最长匹配前后缀子串b[0,y] 和b[i-y-1,i-1]这两本身就是一一匹配的,而next数组记录的只有前缀我们仍然利用现有条件做推断)的最长可匹配前缀子串(必然跟后缀子串一致),就是b[0,i-1]的次长可匹配子串(划重点)(因为b[0,i-1]的最长可匹配子串c因为c这个串接下来一个字符跟b[i]不等,求取c它的最长可匹配子串一直到下个字符b[x+1]与b[i]相等递归求取)。
可能我说的跟理解的有点问题,举个例子: abeabfabeabe(主串) abeabfabeabc(模型串) 到e处不能匹配,最长可匹配子串就是 abeab接下来发现f与e不一致然后再求取abeab的最长可匹配子串 , 为ab接下去的e刚好跟e匹配。
展开