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
;
}
查看全文
相关阅读:
[HNOI2003]消防局的设立
[HNOI2003]操作系统(优先队列,堆排序)
车站分级 (2013noip普及组T4)(树形DP)
中国剩余定理
楼房重建(分块优化)
[HAOI2010]软件安装(树形背包,tarjan缩点)
[USACO08NOV]时间管理Time Management(排序,贪心)
没有上司的舞会(树形DP)
选课(树形DP)
miller rabin 素性测试
原文地址:https://www.cnblogs.com/sunkang/p/2038832.html
最新文章
21.Nodejs基础知识(下)——2019年12月16日
20.Nodejs基础知识(上)——2019年12月16日
19.go语言基础学习(下)——2019年12月16日
16.go语言基础学习(上)——2019年12月16日
18.Vim基础指令(自用)——2019年12月13日
17.以太坊的一些点——2019年12月13日
mysql生成随机字符串
MySQL的btree索引和hash索引的区别 (转)
jenkins遇到含中文路径的SVN地址时认证通不过
centos记录uptime,tomcat日志切割,远程拷贝日志脚本
热门文章
linux逻辑卷管理 (LVM)(转)
centos增加swap分区
redis -clock_gettime问题
tomcat日志切割
【MySQL】 DB 回滚崩溃案例一则
[JSOI2008]最大数(线段树基础)
[USACO5.2]蜗牛的旅行Snail Trails(有条件的dfs)
CF294C Shaass and Lights(排列组合)
小a的强迫症(组合数学)
SAC E#1
Copyright © 2011-2022 走看看