KMP算法原理

该算法和暴力算法区别:原字符串和子字符串从头开始匹配,当出现不相等情况时,二者的做法:

暴力算法:有两个指针,第一个指向原字符串的起始位置,第二个是遍历指针,当出现匹配失败的情况时,原字符串指针右移一个位置,遍历指针重置,即回到起始位置。

ps:匹配的意思是判断二者指向的元素是否相等。

KMP算法:也是两个指针,第一个指针,第二个指针分别是原字符串,和字串的起始位置。每次进行匹配,成功则向右移,失败时,第一个指针不动,第二个指针负责跳转位置,而至于跳到哪个位置,这就是这个算法的作用了。

循循渐进的讲,首先,要明白一点,第二个指针的位置的前面所有n个元素和第一个指针前面的n个元素是相同的,因为相等才会右移,对吧。坚信这一点,并且一直得保证这个原则。

比如在匹配的时候第二个指针在第n+1的位置匹配失败,比如abcabe在e这个位置匹配失败,我们要跳到第x个位置保证x前面的y个元素和第一个指针前面的y个元素相同,于是就有了前后缀这个概念,就是为了解决跳转问题才引出的,对于abcabe在e这个位置匹配失败了,指针会跳到哪里,没错就是c这个位置,因为c前面的2个元素ab一定和e前面的两个元素相同,如何确定c的下标,就是e前面的字符串前缀和后缀相等时,前后缀的最大元素个数。就是要找这个前缀和后缀,前缀就是第二个指针前面的n个元素,后缀就时第一个指针前面的n个元素,所以才有了字串每个元素的最大前后缀相等表(我自己取的名),就是next数组。大家理解了吗

该算法的优点,取消了遍历指针,增加了一个算法删除了重复匹配的字符的匹配。

希望大家认真琢磨思考,因为我发现网上的很多都是在讲具体操作过程,我这篇文章,主要是循循渐进诱导大家思考理解该算法的产生与作用,只用真正理解了,才能说掌握了。这个算法给我们带来几点启示:重复的事情往往都能被解决,被替代;多思考如何解决重复出现的问题,多观察规律,打破思维惯性。

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值