KMP算法学习

以前因为觉得字符串处理很麻烦就一直没看,今天看到miku的全息投影演唱会,就想到mmd,就想到k动作,就想到视频机器学习直接得出动作,就想到学机器学习,突然想起来还没看过自动机,又发现淦他娘连KMP都不会,于是看一看

 

一个能看的教程:https://segmentfault.com/a/1190000007066358#articleHeader7

 

才发现原来我高中学习效率低是教程没找对,都写的什么狗屎

 

今天好好看了一下,写点东西加深印象

 

KMP算法——用来匹配字符串

主串s,模式串p

主串上指针i,模式串上指针j

步骤:

  1. 在模式串中找出前缀和每个字符x对应后缀的最长公共匹配,长度为L
  2. 用数组记录模式串中每个字符x对应的最长匹配长度,next[x] = L,如:

一个问题是,在匹配的过程中,怎么保证i能只往后走,不用回头?

看这个图:

图中,模式串P和主串S都匹配了一长串,已匹配的串里面开头有一个p0,结尾有一个p0,中间还有一个p0,接下来的s1和p1不匹配。

 

其中,已匹配的串中假设前缀和后缀的最长公共匹配就是p0(p0可以代表一个字符,也可以代表一个字符串)

 

假设随着匹配,i到了如图的位置,那么前面的一串全部匹配成功,三个p0和中间的字符全部匹配。那么在p1和s1不匹配的时候,模式串会往右移动到第三个p0处,即:

这个时候就有一个问题,上面有三个p0,直接移动到第三个p0处,不管第二个p0,这样会不会有一点钦定的意思?

 

然而事实是,假如从第二个p0来匹配,必失败。为什么呢,我们首先把上面那个图改一下,把几个p0之间的字符串标记一下:

假如从第二个p0处开始匹配能够匹配成功,那么b必等于c,而根据此前的匹配有a等于c,b等于d。

 

也就是abcd全都相同,那么前缀和后缀的最长公共匹配就不是p0,故得证。

 

其他的以后再写

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值