zoukankan
html css js c++ java
KMP匹配算法中的失效函数
今天总算是看懂了字符串匹配算法中的KMP,记下来吧,以后查的时候方便
失效函数:设模式 P=p
0
p
1
....p
m-2
p
m-1,
则它的失效函数定义如下:
f(j)=k |当 0<=k<j 时,且使得 p0p1....pk=p
j-k
p
j-k+1
...p
j
的最大数
f(j)= -1 | 其它情况。
j
0
1
2
3
4
5
6
7
p
a
b
a
a
b
c
a
c
f(j)
-1
-1
0
0
1
-1
0
-1
详细的不记了,把算法记下来。
void
String::fail
{
int
lengthP
=
curLen;
f[
0
]
=-
1
;
for
(
int
j
=
1
;j
<
lengthP;j
++
)
{
int
i
=
f[j
-
1
];
while
(
*
(ch
+
j)
!=*
(ch
+
i
+
1
)
&&
i
>=
0
) i
=
f[i] ;
//
递推计算
if
(
*
(ch
+
j)
==*
(ch
+
i
+
1
))f[j]
=
i
+
1
;
elsef[j]
=-
1
;
}
}
下面是普通的匹配算法:
int
String::find(String
&
pat)
const
{
char
*
p
=
pat.ch;
*
s
=
ch;
int
i
=
0
;
if
(
*
p
&&
*
s)
while
(i
<=
curLen
-
pat.curLen)
if
(
*
p
++==*
s
++
)
{
//
C++的精典之处
if
(
!*
p)
return
i;
}
else
{ i
++
; s
=
ch
+
i; p
=
pat.ch; }
return
-
1
;
}
下面是 KMP 算法:
int
String::fastFind(String
&
pat)
const
{
int
posP
=
0
, pasT
=
0
;
int
lengthP
=
pat.curLen, lengthT
=
curLen;
while
(posP
<
lengthP
&&
posT
<
lengthT)
if
(pat.ch[pasP]
==
ch[posT]
{
posP
++
; posT
++
;
}
else
if
(posP
==
0
) posT
++
;
else
posP
=
pat.f[posP
-
1
]
+
1
;
if
(posP
<
lengthP)
return
-
1
;
else
return
posT
-
lengthP;
}
查看全文
相关阅读:
业务线--node中间层做一个透传的项目
JavaScript 字符串replace全局替换
纯HTML和CSS实现点击切换
css 清除一些默认的设置
js异步请求方式
VScode编辑器个性化配置
webpack 解决跨域问题
node.js连接MongoDB数据库,db.collection is not a function完美解决
nodejs中安卓端的编码如何转换为中文
深入理解js的变量提升和函数提升
原文地址:https://www.cnblogs.com/icehong/p/46613.html
最新文章
论程序员成长的正确姿势
论程序员成长的正确姿势
第三方登陆原理
通过JS判断浏览器类型
zend framework2常用操作2
php 生成验证码
ZF2开发中常用操作
使用位运算处理权限问题
rbac权限管理
laravel 生成model
热门文章
脏读、不可重复读、幻读
npm 模块的总结
对象属性访问的总结
cross-env使用笔记
业务线B/C端业务组件总结
什么是nrm
react生命周期,中间件、性能优化、数据传递、mixin的使用
微信小程序支付遇到的坑
业务线接入前端异常监控sentry
Promise源码深入理解
Copyright © 2011-2022 走看看