KMP算法


title: KMP算法
date: 2019-12-15 10:03:11
tags:

kmp算法是改进的字符串匹配算法。当我们想知道字符串a在字符串b第一次出现的位置时,最笨的办法就是暴力遍历。

暴力遍历查找字符串出现的位置

暴力遍历很容易理解,外面用个for循环遍历a的每个字符。里面用for循环遍历b的每个字符,和a的字符串进行匹配比较。不匹配就结束里面的循环。
外面a继续查下一个字符,b又重头来和a进行匹配。
举个例子,比如外面是用a的第i个字符,那么里面就需要比较a的第i个字符和b的第0个字符是否相等,a的第i+1个字符是否和b的第1个字符一样。如果出现不一样,就说明不匹配,退出里面的循环。匹配到了就继续匹配,直到匹配完b。

暴力遍历的时间复杂度

a的字符串长度是m,b的字符串长度是n。查找b在a第一次出现的位置,时间复杂度是m*n。

KMP算法查找字符串出现的位置

匹配字符串时,当匹配到a的前n个字符和b的前n个字符一样,n+1个字符不一样时。如果前n个字符的前缀和后缀一样的最大长度是k的话,a中第n+1个字符的前面k个字符和b的前k个字符是完全一样的。那么a完全可以从第n+1个字符开始,b从第k+1个字符开始,a和b的每个字符开始匹配,直到把b匹配完了。

KMP算法的实现

kmp算法需要一个数组记录b的子串(子串第一个字符都是原字符串的第一个字符)前缀和后缀一样的最大长度。这样,a从第1个字符开始和b匹配,直到发生了匹配不到的情况。假设有n个字符匹配到了,就需要去找b前面n个字符的子串前缀和后缀一样的最大长度k。这样b直接从k+1开始,a继续从当前位置开始和b进行匹配。

记录一个字符串子串的前缀和后缀一样的最大长度。需要一个for循环,统计每一个子串的前缀和后缀一样的最大长度。统计i的结果是k。那么统计i+1,如果b的第i+1个元素等于第k+1个元素,表示前k+1和后k+1个元素是完全一样的。那么i+1的统计就是k+1。如果不一样,就需要找到k的前缀和后缀一样的最大长度l。然后比较第l+1个元素和i+1个元素是否一样,一样i+1的统计结果就是l+1。不一样继续递归从数组里找l的统计结果。直到结果为0或者找到了匹配为止。

KMP算法的时间复杂度

a的字符串长度是m,b的字符串长度是n。统计数组时复杂度是n,匹配a时复杂度时m,总的时间复杂度是m+n。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值