求取最长前后缀长度和部分匹配值
模式串: acacaca 长度:7
求模式串PM(部分匹配),先求最长前后缀长度
| — | 前后缀交集 | 最长前后缀长度 |
|---|---|---|
| a | ∅ | 0 |
| ac | ∅ | 0 |
| aca | a | 1 |
| acac | a ac | 2 |
| acaca | a aca | 3 |
| acacac | ac acac | 4 |
| acacaca | a aca acaca | 5 |
不妨设:串位序从1开始,于是有下表
| j | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|
| P | a | c | a | c | a | c | a |
| PM | 0 | 0 | 1 | 2 | 3 | 4 | 5 |
Q1:PM传达了什么信息呢?例如PM[5]=3
A1:反映了模式分别从头和从第5个字符,往后/前数3个字符,得到的两个部分重合,多1个就不重合
| j | 1 | 2 | 3 | 4 | 5 |
|---|---|---|---|---|---|
| P | a | c | a | c | a |
| 从前往后 | a | c | a | ||
| 从后往前 | a | c | a |
暴力匹配和KMP匹配
Q2:PM怎什么用呢?下面举例说明,不妨设:
| i | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | … |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 主串S | c | a | c | a | c | a | a | c | a | b | c | … |
| 模式P | a | c | a | c | a | c | a | |||||
| j | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
某一趟,j=6时不匹配,即S[7]≠P[6]
这意味着:
①主串有字符序列与模式串前5个字符组成的部分相同,即acaca(下面简称“部分模式”)
②这一部分第6个和模式第6个字符不相同即c、a
下一趟

本文详细介绍了KMP算法,包括如何求取最长前后缀长度和部分匹配值,以及KMP算法在字符串子串查找中的应用。通过实例解释了PM值的作用,指出KMP算法相比于暴力匹配的时间复杂度优势。还探讨了KMP算法的变形与优化,如next数组的计算和优化策略,以提高匹配效率。
540

被折叠的 条评论
为什么被折叠?



