Content
- 串的模式匹配
- BF算法
- KMP算法
串的模式匹配
概念:在主串中找到与模式串相同的子串,返回其所在位置
BF算法
O(n^2)暴力扫描,思路简单
1 | int BF(const string& S, const string& T){ |
KMP算法
思想:当两个字符失配时,可以得到信息:前面的所有字符都匹配成功。KMP算法就是利用这部分信息,让i不回溯,提高匹配效率
KMP算法具体解释,可以移步我的BiliBili视频 手撕KMP!|理论+cpp实现
下面给出王道考研书的实现:字符串从数组的下标1处开始
求next数组—手动
- next[1] = 0
- 字符i的前缀:区间[1, i-1)范围内,必定包含[1]位置处字符的子串
- 字符i的后缀:区间(1, i-1]范围内,必定包含[i-1]位置处字符的子串
- next[i] = 字符i处,最大相等前后缀长度+1
求next数组—计算机
相当于模式串和自己KMP
1 | void get_next(const String& T, int next[]){ |
KMP算法—index从1开始
1 | int KMP(const String& S, const String& T, const int next[]){ |
nextval数组—KMP算法优化
可以减少不必要的比较
- 手动计算:
- nextval[1] = 0 定义
- 从左往右推。求出next[j], 如果S[j] = S[next[j]],则nextval[j] = nextval[nextval[j]];反之nextval[j] = next[j]
- 算法实现
1 | void get_nextval(const String& T, int nextval[]){ |
KMP匹配过程则和原本一样