说说我对KMP算法的理解
KMP算法是一种用于模式匹配的算法,其主要的特点是以空间换取时间,在提前得到next数组信息后,利用该信息减少指针回溯,提高了匹配效率。
主要的原理是利用了提前计算好匹配串内next数组的信息,该数组记录了匹配串内每位字符内存在的最长的匹配前后缀。例如
next数组的计算是将匹配串上每位字符前的字符(包括自己本身)取前缀后缀进行对比,得到最长前后缀长度的便是该位字符的next值。
例如匹配串中的第二个A,此时需要取前后缀的范围是A B C D A。
前缀有[A],[A B],[A B C],[A B C D]
后缀有[A],[D A],[C D A],[B C D A]
可得到最长的前后缀公共部分为[A],可得到该个A的next数组值为1,以此类推可得其他部分的next值(记得是取最长部分的公共前后缀)
在理解了如何得到next数组后理解KMP使用就简单起来了
匹配串在和主串进行匹配的过程中需要移动的下标则不需要反复回溯,匹配串只需要按照下面的规则移动:
移动步数=已匹配字符数-最后一位匹配字符的next值
例如主串为:ABCDABABCDABCDABDE
匹配串为: ABCDABD
第一次移动步数=已经匹配字符数目(ABCDAB)- 最后一位匹配的字符next值 即 6-2=4
例如主串为:ABCDABABCDABCDABDE
匹配串为: ABCDABD
第二次移动步数 = 已经匹配字符数目(AB)- 最后一位匹配的字符next值 即 2-0=2
例如主串为:ABCDABABCDABCDABDE
匹配串为: ABCDABD
第三次移动步数 = 已经匹配字符数目(ABCDAB)- 最后一位匹配的字符next值 即 6-2=4
例如主串为:ABCDABABCDABCDABDE
匹配串为: ABCDABD
此时匹配完成得到主串中匹配的位置