1 算法目的
KMP算法是模式匹配算法的一种高效方式,即在一个字符串中查找是否包含目标的匹配字符串。
2 算法分析
对于在字符串中查找子串的方法,我们会很自然地想到一种方式。首先把被查找的字符串和要查找的子串对齐,看第一位是否匹配,如果匹配就看第二位是否匹配。否则,就把子串整体向右滑动一位,再从子串的第一位开始和父串匹配,直到查找到子串为止。
2.1 简单模式匹配的问题
这样的一个算法看起来很简单也没有什么问题,问题就在于这样效率比较差,这样做复杂度是什么?
于是有了KMP这样的一种非常巧妙的算法。KMP的关键就在于,当我们发现子串和某一位不匹配时,并不一定要向右移动一位,因为之前的字符串我们已经扫描过了,有很多情况下我们可以看到,移动一位一定不匹配。问题就是,我们可以往右滑动几位呢?
2.2 部分匹配表
部分匹配表是对子串中当前已经匹配的那部分而言的。比如现在我们已经匹配了ABCDAB这样一个子串。那么,这个子串这部分的部分匹配值就是它的全部前缀和全部后缀中最长的共有元素的长度。
- "ABCDAB"的前缀为[A, AB, ABC, ABCD, ABCDA],后缀为[BCDAB, CDAB, DAB, AB, B],共有元素为"AB",长度为2;(复制自阮一峰的博客)
2.3 KMP匹配的过程
KMP匹配的过程和上面描述的过程基本一致,区别就在于,当发生不匹配的情况时,不是右移一位,而是移动(当前匹配的长度– 当前匹配子串的部分匹配值)位。这样可以省去很多的不必要的匹配,大大提高了效率。