kmp算法
来源:互联网 发布:同花顺软件时间不对 编辑:程序博客网 时间:2024/06/06 22:35
先看下代码
返回的是b串第一次在a串的pos位置后出现的位置
可以显而意见的是复杂度为O(n*m)
在a串和b串为如下的形式的时候时
a:0000000001
b:001
你会发现b串在a串中进行匹配的时候,要到最后一次才会匹配成功,而前面的匹配很多都做了无用功,i指针根本就没必要回朔
kmp算法
kmp算法巧妙的解决了这个问题
将问题的复杂度下降到O(n+m)
那么它是怎么实现的呢?
先给大家看几个图示
当a串与b串进行比较的时候,可能在分别在i和j的位置的时候匹配失败了
这个时候如果是一般匹配方法就会i指针回朔到b1+1位置,而j则会回朔到b2位置
但是如果仔细观察下你会发现(b1,i-1)和(b2,j-1)是完全匹配的,而且你也可能会发现可能在b串中本身就存在(b2,s)完全等于(k,j-1)的情况,那么这个时候何不直接把j回朔到s+1的位置呢?
如下图所示
这样算法复杂度就可以得到很好的优化
但是如何实现以上过程呢
这里引进next数组
next[i]:=如果匹配失败了j指针应该滑向的位置
也可以理解成最大的一个值使得对于b串而言(0,next[i]-1)完全等于(j-next[i],j-1)
则可以定义如下
next[i]=-1,i==0
next[i]=k,,0<k<j,其中"p0p1p2p3...pk-1"="pj-kpj-k+1pj-k+2...pj-1"
next[i]=0,其余的情况,其实也就是b串0到j-1的位置上没有前后相互匹配的情况
那么只要求出next数组的值,就万事大吉了
下面给出代码
写法二,思路都是一样的,只是代码习惯的不同。。
1 0
- KMP算法详解 【KMP】
- 【KMP】KMP算法模板
- KMP hihoCoder1015 KMP算法
- kmp算法
- KMP算法
- KMP算法
- KMP算法
- KMP算法
- KMP 算法
- kmp算法
- KMP算法
- kmp算法
- KMP算法
- KMP算法
- kmp算法
- kmp算法
- KMP算法
- KMP算法
- 传说中的双击返回桌面,其实就这么一句话
- GCD and LCM Aizu
- 第16课时 流程控制和运算符,字符串,数组,土豆网右下角悬浮导航效果
- 个人Java编程规范
- django使用配置文件进行数据库连接
- kmp算法
- 哪个声明能够实现首行缩进2个字符
- 双端队列--Deque 容器
- 邮递员送信
- 感知机算法(一)---原理
- iOS回顾笔记( 01 )
- 电脑配置adb端口,最简单的方法
- redis cluster管理工具redis-trib.rb详解
- Backward Digit Sums POJ