KMP算法
2015-11-16 23:04
295 查看
KMP算法是字符串模式匹配的一个改进的算法,此算法可以 在O(m+n)的时间数量级上完成串的模式匹配操作。其主要是求next[]数组。看了好多文章,说的不是很清楚,也不是很好理解。在这里写上我自己的一个看法。我的这个见解只为了很快求出next[]数组,至于具体的代码实现,还是用经典的代码实现。
KMP算法的思想是当主串中的第i个字符与模式中的第j个字符“失配“(即比较不相等)时,主串中的第i个字符(i不回溯,当然是可以往前加1的)应与模式中的哪个字符比较。(这个可以先不理解,看完就懂啦)
举个例子:
next[j]就是找到p1p2......pj-1这个串中”最长的对称的字符串“。我是加引号的啊,不一定是你想的对称啊!
个人思想:
next[1]为0,next[2]为1,这是不用再算的,也是一定的。我们也没有必要再费心去算。我们从第三个开始。
aba: 其前缀字符串是ab.我们所说的最长的对称子字符串是指这样的对称。如:ab ab 。而不是类似这样的对称,
ab ab a。对,我想表达的意思就是第一个字符串中必须含有第一个字符,第二个字符串中必须含有最后一个字符。所以ab的最长的对称的字符串是0,所以我们的next[3]=0+1=1,对就是最长字符串加1。至于为什么是这样,我想表达一下,却发现很难用语言来说明(原谅我吧)
abaa:其前缀字符串是aba,按我们所说的对称标准,其最长的对称字符串的长度是1,所以其next[4]=1+1=2。
abaab:其前缀字符串是abaa,其最长的对称字符串长度也是1,所以其next[5]=1+1=2;
abaabc:其前缀字符串是abaab,其最长的对称字符串是前后的ab,所以其长度是2,所以next[6]=2+1=3;
abaabca:其前缀字符串是abaabc,是没有我们所说的对称的,所以是0,所以next[7]=0+1=1.注意:这里的p1p2=ab,p4p5=ab,这两个字符串不是我们所要的对称字符串。因为第二个字符串没有包含p6,即pj-1这个字符。
。。。。。。。。。。。。。
这个方法,做了牛客网上的几道题,亲测还是可以用的。是正确的。其实这样做是有理论依据的。也是符合那个其next[j]的公式的。
KMP算法的思想是当主串中的第i个字符与模式中的第j个字符“失配“(即比较不相等)时,主串中的第i个字符(i不回溯,当然是可以往前加1的)应与模式中的哪个字符比较。(这个可以先不理解,看完就懂啦)
举个例子:
j | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
模式串 | a | b | a | a | b | c | a | c |
next[j] | 0 | 1 | 1 | 2 | 2 | 3 | 1 | 2 |
个人思想:
next[1]为0,next[2]为1,这是不用再算的,也是一定的。我们也没有必要再费心去算。我们从第三个开始。
aba: 其前缀字符串是ab.我们所说的最长的对称子字符串是指这样的对称。如:ab ab 。而不是类似这样的对称,
ab ab a。对,我想表达的意思就是第一个字符串中必须含有第一个字符,第二个字符串中必须含有最后一个字符。所以ab的最长的对称的字符串是0,所以我们的next[3]=0+1=1,对就是最长字符串加1。至于为什么是这样,我想表达一下,却发现很难用语言来说明(原谅我吧)
abaa:其前缀字符串是aba,按我们所说的对称标准,其最长的对称字符串的长度是1,所以其next[4]=1+1=2。
abaab:其前缀字符串是abaa,其最长的对称字符串长度也是1,所以其next[5]=1+1=2;
abaabc:其前缀字符串是abaab,其最长的对称字符串是前后的ab,所以其长度是2,所以next[6]=2+1=3;
abaabca:其前缀字符串是abaabc,是没有我们所说的对称的,所以是0,所以next[7]=0+1=1.注意:这里的p1p2=ab,p4p5=ab,这两个字符串不是我们所要的对称字符串。因为第二个字符串没有包含p6,即pj-1这个字符。
。。。。。。。。。。。。。
这个方法,做了牛客网上的几道题,亲测还是可以用的。是正确的。其实这样做是有理论依据的。也是符合那个其next[j]的公式的。
相关文章推荐
- Java: 正则表达式
- Libcompose 与畅游 Docker Compose
- iOS学习:调用相机,选择图片上传,带预览功能
- java Socket 传输对象的时候程序没反应了。
- netstat 查看TCP状态值
- 下一步博客计划
- 南大软院大神养成计划——第一天
- 正向代理与反向代理
- 夜/日间模式切换
- 当文本框输入完成,取消第一响应者
- Activity详细总结
- 使用bmeps将JPG PNG格式图片转EPS格式
- 微信支付 出现 签名错误 有可能的原因是因为参数中含有空格
- python 实现 Dijkstra最短路径问题
- PHP错误处理
- 32bitwin7,vs2010下配置CSparse
- iOS - Umeng分享
- mac os 中类似于Linux的yum工具,或ubuntu的apt-get工具Homebrew
- 2015.11.14 ---2015.合肥
- Android屏幕适配全攻略(最权威的官方适配指导)