KMP 算法
KMP
KMP 算法是一种模板匹配算法,在字符串匹配中非常高效,时间复杂度为
传统简单匹配算法效率低下的原因在于,当匹配失败时,仅仅是将模板向后移动一位继续匹配,没有从之前匹配过的模式中获取有用的信息.
暴力匹配算法
传统的模式匹配算法是将模板与字符串一一进行匹配,如果匹配成功,返回当前模板与字符串对应的开始位置;如果匹配失败,将模式字符串向后移动一位,继续进行匹配,由此可知最坏情况下的时间复杂度为
1 | size_t strStr(const string& T, const string& P) |
预备知识
- 字符串的前缀
从下标 0 开始的一段连续的字串,用prefix(i)表示字符串中这个前缀 - 字符串的后缀
从任意下标开始到字符串结尾的一段连续字符串, 用suffix(i)表示字符串中这段后缀 - 两个串的最长公共前缀
两个串的前缀中相等且最长的一组前缀
失配函数
KMP 先对模式字符串进行处理,得到一个 next 数组,又称失配函数.
next 表的每一位表示前缀和后缀集合中最长相同字串的字符数.
当发生失配时移动位数 = 已匹配的字符数 - 对应的 next 值
好麻烦啊