子串匹配算法
给定一个文本text,需要筛选出与pat匹配的子串.
朴素算法
对于长度为n的文本text,从每一个下标开始进行匹配,有(n-m)中选择,最坏情况下,每次都匹配成功,则复杂度为: O ( ( n − m ) m ) = O ( n m ) O((n-m)m) = O(nm) O((n−m)m)=O(nm), 其中m为字符串pat的长度.
从字符串的匹配过程来看,当发生匹配失败或者匹配成功时,pattern的滑动成为了问题的关键.

朴素算法每次滑动一个单位,导致了大量的重复比较.
想办法多滑动几个单位是模式匹配优化的关键.
我们追求一种线性复杂度的算法,当然这种算法是存在的,这就是KMP算法.
KMP算法
我们暂时不证明KMP算法的有效性,这里仅给出KMP算法的一般步骤.
KMP算法的关键在于生成lps数组. lps数组的元素lps(i)代表着text[0:i+1]的前缀和后缀相同的长度,且前缀长度小于i+1.
例:

从前往后匹配当发生不匹配或者匹配成功时,把j赋值为lps[j-1],如果j为0,则 i向后移动一位.
代码实现
在实现代码时,存在一些优化方法.
- 用next数组替换lps数组
- 求解lps的优化
对于第一点,比较明确,就是把lps数据整体右移一个单位,即有
n e x t [ i ] = { l p s [ i − 1

本文介绍了KMP算法,一种用于解决子串匹配问题的线性时间复杂度算法。通过生成lps数组来避免重复比较,提高匹配效率。文章详细阐述了KMP算法的步骤,包括如何生成lps数组,并提供了优化思路,例如使用next数组代替lps数组,并展示了算法的运行过程和代码实现。
最低0.47元/天 解锁文章
144

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



