浅谈JavaScript算法系列:一、KMP算法

字符串比对算法:KMP算法

网上对这个算法的介绍已经很多了,这些我就不做介绍了

直接上源码:https://github.com/yl617341586/JavaScript-Algorithm

此算法通过JavaScript实现,也是我第一次实现,有很大优化空间,意在与大家交流

算法思想:

首先通过模式字符串,求出部分匹配表,然后不从理会它。我们开始进行字符串暴力比对,当主字符串与模式字符串相同指针(就当有指针)指向的值相等时和普通的比对没有任何区别,区别就在于当相同指针的值不相等时,普通的比对算法是将主字符串指针向后加1,模式字符串指针归零。
而KMP算法就是减少模式字符串向前移动的位数和次数,选择合适额位置开始比对。那么如何求出这些位置就是KMP算法的核心思想。

如何求出指针下一次比对的位置

如果前缀和后缀有交集的话会满足公式P[0 ~ k-1] == P[j-k ~ j-1]
j代表模式字符串当前指针位置,所以我们用在部分匹配表取下标为j-1的值,此值即为下一次指针的位置

如何求部分匹配表

部分匹配表是个列表结构,我们先求出模式字符串的前缀和后缀,放入两个集合中,然后求两个集合的交集,如果某次求交集的过程中出现两个交集我们取长度最长的,然后将长度存入部分匹配表。

如何求前缀、后缀

我们首先得知道什么是前缀和后缀,举个栗子:
模式字符串sModelStr = ‘aba’;
第一次取前缀、后缀的字符串为’a’ ,它没有前缀和后缀
第二次取前缀、后缀的字符串为’ab’ ,它的前缀为’a’后缀为’b’
第二次取前缀、后缀的字符串为’aba’ ,它的前缀为’a’,‘ab’后缀为’a’,‘ba’
注意,这里取前后缀是有顺序区别的。
规律就是前缀除了最后一个都取,后缀除了第一个都取。

这样两个方法就定义完了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值