*自己的总结
定义,模式串为s,匹配串为t,s的指针为i,t的指针为j。
KMP本质上就是利用next数组中预处理出来的信息(即最长相等前后缀,next[j]表示t1~tj-1的最长相等前后缀长度,同时是如果在tj处匹配失败后子串的指针j应该指向的位置),来加快字符串的匹配。
例如,next[j]=3时,若当前t的第j位与s的第i位匹配失败,那么根据next数组的定义,t0、t1、t2等于tj-3、tj-2、tj-1,而tj-3、tj-2、tj-1又是等于si-3、si-2、si-1的(因为t的前j-1位必然匹配成功,否则指针不可能指向第j位),因为这些位都相等,因此没有必要从头开始匹配,可直接从tnext[i],即t3开始再次与si匹配。
而next数组的求法本身就是一次KMP算法,带着这个思想看大佬图解即可。
百科上扣的总结
KMP中我们用两个指针i和j分别表示,A[i-j+ 1…i]与B[1…j]完全相等。也就是说,i是不断增加的,随着i的增加j相应地变化,且j满足以A[i]结尾的长度为j的字符串正好匹配B串的前 j个字符,当A[i+1]≠B[j+1],KMP的策略是调整j的位置(减小j值)使得A[i-j+1…i]与B[1…j]保持匹配且新的B[j+1]恰好与A[i+1]匹配,而next函数恰恰记录了这个j应该调整到的位置。