KMP模式匹配算法中,核心就在于next[j]数组的赋值。这里字符串数组均从下标1开始,下标0,用于存储字符串长度。
个人理解,next[j]的值表示,从1到j-1的位置上,有多少个匹配的字符串(包括一个字符)+1。其中定义,当j=1,next[j]=0;当j不等1,查看从1到j-1位置的字符,进行比较。较简便的方法为,如a1a2a3a4a5,如只有一位,则比较a1与a5是否相等,如果二位相等,则比较a1a2和a4a5,即a1...ak-1=a j-k+1...aj-1。由此可计算出k值(按最大匹配数)。即为next[j]=k;
若随着j的增大,遍历一直没有匹配的,则next[j]=1;
KMP模式匹配算法用i,j值作为指针。i不回溯,j会
S字符串数组为abcdefgab。T字符串数组为abcabx。
当i=4,j=4时,d与a不相等,i=4,j=next[4]=1。因为在T[4]之前没有匹配的字符,所以从j=1开始。
如果next[4]=2,则表示,T[1]与T[3]是相等的。那么假设为T[3]为a,那么会进行S[4]与T[2]比较。因为当i=4,j=4时,证明前三个都是匹配的。那么S[3]=T[3]=T[1]。这就解释了,它的效率比传统的高。因为i是直接向后遍历,而j会跳过已经匹配过的,回退到不匹配的地方。从而提高效率。