KMP字符串匹配算法

T=abaacababcac;

P =ababc

在T中寻找P,并返回第一个位置

java中有一个函数可以实现这个

T.indexOf(P);

KMP算法首先要计算一个前缀表 prefix table;

P的前缀表是:

a               0

a b            0

a b a         1

a b a b      2

a b a b c   0

最长公共前后缀的长度,指的是除字符串本身外的最长连续子串;

比如abab的最长前缀是aba  最长后缀是bab 但是此时最长前缀和最长后缀不一样

最长公共前缀是ab,最长公共后缀是ab,此时相同,所以最长公共前后缀是ab,长度为2

计算得最长公共前后缀长度的列表是0 0 1 2 0,把最后一个0去掉,最前面加上一个-1 ,得到prefix table;

P=   a b a b

      -1 0 0 1 2

       0 1 2 3 4   索引;

T=abaacababcac;

P=ababc

将p与t进行匹配,从第一个位置开始,如果出现没有匹配上的位置,就将p的前缀表所指的数字当成索引,比如位置3的b未匹配成功,而此时b在索引表中是1,所以移动p使得索引1处的元素对应到这个位置,比较失败后下一次是从失败的位置开始。

T=abaacababcac;

P=    ababc  第一次移动后,注意索引表中-1表示0之前的一个位置,移动之后重新匹配,执行上面的步骤

KMP算法:

1、求出前缀表

2、搜索

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zero _s

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值