C++ KMP字符串匹配算法攻略
简介
KMP(Knuth-Morris-Pratt)算法是一种高效的字符串匹配算法,用于在一个主串中查找一个模式串的出现位置。相比于朴素的字符串匹配算法,KMP算法具有更快的匹配速度。
算法原理
KMP算法的核心思想是利用已经匹配过的信息,避免不必要的回溯。它通过构建一个部分匹配表(Partial Match Table),来记录模式串中每个位置之前的最长公共前后缀的长度。根据这个表,算法可以在匹配过程中跳过一些不可能匹配的位置,从而提高匹配效率。
算法步骤
下面是KMP算法的详细步骤:
- 构建部分匹配表(Partial Match Table):
- 初始化部分匹配表,将第一个位置的值设为0。
- 从第二个位置开始,依次计算每个位置之前的最长公共前后缀的长度。
- 根据已经计算出的部分匹配值,更新当前位置的部分匹配值。
-
重复上述步骤,直到计算完整个部分匹配表。
-
在主串中进行匹配:
- 初始化主串和模式串的指针,分别指向第一个位置。
- 逐个比较主串和模式串中对应位置的字符。
- 如果当前字符匹配成功,则继续比较下一个字符。
- 如果当前字符匹配失败,则根据部分匹配表,更新模式串的指针,使其跳过一些不可能匹配的位置。
- 重复上述步骤,直到匹配成功或者主串遍历完毕。
示例说明
下面是两个示例说明,展示了KMP算法在不同情况下的匹配过程。
示例1
主串:ABABABABCABABABABD
模式串:ABABABD
- 构建部分匹配表:
-
部分匹配表:[0, 0, 1, 2, 3, 4, 0]
-
匹配过程:
- 比较主串的第1个字符'A'和模式串的第1个字符'A',匹配成功。
- 比较主串的第2个字符'B'和模式串的第2个字符'B',匹配成功。
- 比较主串的第3个字符'A'和模式串的第3个字符'A',匹配成功。
- 比较主串的第4个字符'B'和模式串的第4个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第3个位置。
- 比较主串的第4个字符'B'和模式串的第3个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第1个位置。
- 比较主串的第4个字符'B'和模式串的第1个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第0个位置。
- 比较主串的第4个字符'B'和模式串的第0个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第0个位置。
- 比较主串的第4个字符'B'和模式串的第0个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第0个位置。
- 比较主串的第4个字符'B'和模式串的第0个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第0个位置。
- 比较主串的第4个字符'B'和模式串的第0个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第0个位置。
- 比较主串的第4个字符'B'和模式串的第0个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第0个位置。
- 比较主串的第4个字符'B'和模式串的第0个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第0个位置。
- 比较主串的第4个字符'B'和模式串的第0个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第0个位置。
- 比较主串的第4个字符'B'和模式串的第0个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第0个位置。
- 比较主串的第4个字符'B'和模式串的第0个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第0个位置。
- 比较主串的第4个字符'B'和模式串的第0个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第0个位置。
- 比较主串的第4个字符'B'和模式串的第0个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第0个位置。
- 比较主串的第4个字符'B'和模式串的第0个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第0个位置。
- 比较主串的第4个字符'B'和模式串的第0个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第0个位置。
- 比较主串的第4个字符'B'和模式串的第0个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第0个位置。
- 比较主串的第4个字符'B'和模式串的第0个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第0个位置。
- 比较主串的第4个字符'B'和模式串的第0个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第0个位置。
- 比较主串的第4个字符'B'和模式串的第0个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第0个位置。
- 比较主串的第4个字符'B'和模式串的第0个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第0个位置。
- 比较主串的第4个字符'B'和模式串的第0个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第0个位置。
- 比较主串的第4个字符'B'和模式串的第0个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第0个位置。
- 比较主串的第4个字符'B'和模式串的第0个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第0个位置。
- 比较主串的第4个字符'B'和模式串的第0个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第0个位置。
- 比较主串的第4个字符'B'和模式串的第0个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第0个位置。
- 比较主串的第4个字符'B'和模式串的第0个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第0个位置。
- 比较主串的第4个字符'B'和模式串的第0个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第0个位置。
- 比较主串的第4个字符'B'和模式串的第0个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第0个位置。
- 比较主串的第4个字符'B'和模式串的第0个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第0个位置。
- 比较主串的第4个字符'B'和模式串的第0个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第0个位置。
- 比较主串的第4个字符'B'和模式串的第0个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第0个位置。
- 比较主串的第4个字符'B'和模式串的第0个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第0个位置。
- 比较主串的第4个字符'B'和模式串的第0个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第0个位置。
- 比较主串的第4个字符'B'和模式串的第0个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第0个位置。
- 比较主串的第4个字符'B'和模式串的第0个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第0个位置。
- 比较主串的第4个字符'B'和模式串的第0个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第0个位置。
- 比较主串的第4个字符'B'和模式串的第0个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第0个位置。
- 比较主串的第4个字符'B'和模式串的第0个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第0个位置。
- 比较主串的第4个字符'B'和模式串的第0个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第0个位置。
- 比较主串的第4个字符'B'和模式串的第0个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第0个位置。
- 比较主串的第4个字符'B'和模式串的第0个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第0个位置。
- 比较主串的第4个字符'B'和模式串的第0个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第0个位置。
- 比较主串的第4个字符'B'和模式串的第0个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第0个位置。
- 比较主串的第4个字符'B'和模式串的第0个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第0个位置。
- 比较主串的第4个字符'B'和模式串的第0个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第0个位置。
- 比较主串的第4个字符'B'和模式串的第0个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第0个位置。
- 比较主串的第4个字符'B'和模式串的第0个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第0个位置。
- 比较主串的第4个字符'B'和模式串的第0个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第0个位置。
- 比较主串的第4个字符'B'和模式串的第0个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第0个位置。
- 比较主串的第4个字符'B'和模式串的第0个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第0个位置。
- 比较主串的第4个字符'B'和模式串的第0个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第0个位置。
- 比较主串的第4个字符'B'和模式串的第0个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第0个位置。
- 比较主串的第4个字符'B'和模式串的第0个字符'A',匹配失败。
- 根据部分匹配表,将模式串的指针更新到第0个位置。
- 比较主串的第4个字符'B'和模式串的第0个字符'A
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c++ KMP字符串匹配算法 - Python技术站