zoukankan
html css js c++ java
KMP 字符串匹配算法
#include
"
stdafx.h
"
#include
<
string.h
>
#include
<
iostream
>
#include
<
vector
>
using namespace std ;
//
模式匹配,kmp算法,复杂度O(m+n)
//
返回匹配位置,-1表示匹配失败,传入匹配串和模式串和长度
//
可更改元素类型,更换匹配函数
#define MAXN
100
#define _match(a,b) ((a)
==
(b))
typedef
char
elem_t;
int
kmp_match(
int
ls,elem_t
*
str,
int
lp,elem_t
*
pat)
...
{
int
fail[MAXN]
=
...
{
-
1
}
, i
=
0
,j;
for
(j
=
1
;j
<
lp;)
...
{
if
(pat[i]
!=
pat[j] )
...
{
fail[j
++
]
=-
1
;
continue
;
}
for
(i
=
0
; j
<
lp
&&
_match(pat[i],pat[j]) ; fail[j
++
]
=
i
++
) ;
}
for
(i
=
j
=
0
;i
<
ls
&&
j
<
lp;i
++
)
...
{
if
(_match(str[i],pat[j]))
j
++
;
else
if
(j)
j
=
fail[j
-
1
]
+
1
,i
--
;
}
return
j
==
lp
?
(i
-
lp):
-
1
;
}
int
kmp(string str1, string str2)
...
{
if
(str1.size()
<
str2.size())
return
-
1
;
size_t i, j ;
vector
<
int
>
fail ;
fail.resize(str2.size(),
-
1
) ;
for
(j
=
1
, i
=
0
; j
<
str2.size();
++
j)
...
{
if
(str2[j]
!=
str2[i])
continue
;
for
(i
=
0
; j
<
str2.size()
&&
str2[j]
==
str2[i] ; fail[j
++
]
=
i
++
) ;
--
j ;
}
for
(i
=
j
=
0
; i
<
str2.size()
&&
j
<
str1.size();
++
j)
...
{
if
(str1[j]
==
str2[i])
++
i ;
else
if
(i)
i
=
fail[i
-
1
]
+
1
,
--
j ;
}
return
i
==
str2.size()
?
j
-
i :
-
1
;
}
int
_tmain(
int
argc, _TCHAR
*
argv[])
...
{
char
*
str1
=
"
abababababcabababa
"
;
char
*
str2
=
"
ababababcab
"
;
int
i
=
kmp_match(strlen(str1),str1,strlen(str2),str2) ;
cout
<<
i
<<
endl ;
i
=
kmp(str1,str2) ;
cout
<<
i
<<
endl ;
getchar() ;
return
0
;
}
查看全文
相关阅读:
Django 报错RuntimeError: Model class apps.alarms.models.SendAlarmRecord doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.
Go获取Windows下的窗口
linux中得到当前目录指定文件或者目录的绝对路径
关于在IDEA中使用maven的运行test目录下的main方法无法找到类的?
数值变量互换的三种方式
对于List和普通数组元素怎么去重的方法
UE编辑器UltraEdit格式化XML数据
java操作JSON字符串转换成对象的时候如何可以不建立实体类也能获取数据
java设置RabbitMQ的消费处理出现:ConditionalRejectingErrorHandler : Execution of Rabbit message listener failed.
org.springframework.http.converter.HttpMessageNotReadableException
原文地址:https://www.cnblogs.com/sunkang/p/2038832.html
最新文章
数位dp模板
红蓝最近点对
模拟退火
Codeforces Round #440 (Div. 2, based on Technocup 2018 Elimination Round 2) D. Something with XOR Queries
Codeforces Round #440 (Div. 2, based on Technocup 2018 Elimination Round 2) C. Maximum splitting
最小圆覆盖
圆的k次面积并
bzoj4561: [JLoi2016]圆的异或并 圆的扫描线
hdu3511 Prison Break 圆的扫描线
poj2932 Coneology
热门文章
bzoj3196: Tyvj 1730 二逼平衡树 树套树
bzoj2733: [HNOI2012]永无乡 启发式合并
Centos 7.5 升级 Git版本
Linux 清除旧版本内核
Go 操作数据库尝鲜
Mysql登录错误:ERROR 1045 (28000): Plugin caching_sha2_password could not be loaded
记关于WIndow Server 2012 一次时间同步
Debian 10 最小化装机后的设置
PowerShell 升级所有的python库
电子书分享
Copyright © 2011-2022 走看看