字符串查找KMP算法java(理论篇)

本文为记录鄙人因学习KMP长时间困扰的疑惑,以及这些疑惑解决的思路问题
学习KMP要先了解字符串查找的暴力算法中的显示回退实现
串查找的暴力算法中的显示回退实现
暴力匹配算法的缺点
文本串:ABAAAABAAAAA 模式串ABAAAAA
例如给定文本串和模式串,我们发现 直到第(5次移动才找到),中间2、3、4次移动都是没必要的(一次移动并不是一次比较),很多时间浪费在这些无必要的中间过程中,是否有什么方法可以规避这些无效的匹配呢?
A B A A A A B A A A A A
—A B A A A A A (1)
---- A B A A A A A (2)
------ A B A A A A A (3)
-------- A B A A A A A (4)
---------- A B A A A A A (5)
KMP算法
KMP算法就是为了解决暴力算法中过多无效步骤的问题, 在前文的暴力算法的实现中,我们不管是双层for循环实现,还是显示回退算法,都用到了两个变量 文本串变量i、模式串变量ji代表每次比较时文本串的字符串索引位,j代表的是模式串索引位,在回显实现中我们看到,每次比较完毕后,i和j都会回退,j每次都回退到0,因为下一轮的比较要拿模式串的首位去比较
那么问题来了,对于暴力查找,每下一轮的查找开始之前,i 都会往下走一位,而 j 都需要回退到0,所以,我们思考是不是可以省略些如此的过程呢?
KMP就是以此思想设计的,KMP实现:i不需要回退,j不需要回退到原始位
在这里插入图片描述
针对上图,我们以图中列出的两个问题作为起始点,首先,j前面的索引为什么不需要比较了?
在这里插入图片描述
找到最大相等前后缀后,该前后缀的长度,就是要下次要和i比较的模式串中字符的索引j的位置

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值