代码随想录 day09 kmp算法
比较难以理解 需要周日复盘
分割线
kmp算法的思想是 最大化利用已知的信息
与暴力穷举相比 kmp算法想通过已经查找的模式串的子串
与目标串进行匹配 而不是机械的重头开始匹配
因为明显有一些情况是可以舍去的 不可能的情况
一般模式串都会有一些特征 一些对称的特征可以利用
如果不是 那么kmp算法实际没有什么优化
其中最重要的就是前缀 后缀的概念
前缀是指不包含最后一个字符的所有以第一个字符开头的连续子串;后缀是指不包含第一个字符的所有以最后一个字符结尾的连续子串
这两个是相对的 如aaaBccc
对于B来说 a就是前缀 aa就是后缀 aaa也可以是后缀
一个重要的数据结构 前缀表
就是指当前位置 前后缀相等的长度
如B就是0 第二个a 就是1
这样对于模式串内的每个位置都有一个值
这个前缀表可以帮我们进行剪枝操作
循环时 如果当前位置不匹配 我们就根据前一个位置的前缀表的值x 回退x个单位 继续在下个位置匹配
相当于我们继承了x单位之前的匹配结果进行匹配 因为前面的都没有出现匹配错误
只是当前位置出错了 那么当然我们可以利用前面的匹配结果进行剪枝

浙公网安备 33010602011771号