以前因为觉得字符串处理很麻烦就一直没看,今天看到miku的全息投影演唱会,就想到mmd,就想到k动作,就想到视频机器学习直接得出动作,就想到学机器学习,突然想起来还没看过自动机,又发现淦他娘连KMP都不会,于是看一看
一个能看的教程:https://segmentfault.com/a/1190000007066358#articleHeader7
才发现原来我高中学习效率低是教程没找对,都写的什么狗屎
今天好好看了一下,写点东西加深印象
KMP算法——用来匹配字符串
主串s,模式串p
主串上指针i,模式串上指针j
步骤:
- 在模式串中找出前缀和每个字符x对应后缀的最长公共匹配,长度为L
- 用数组记录模式串中每个字符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,故得证。
其他的以后再写