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
;
}
查看全文
相关阅读:
HTML特殊字符编码对照表
在Echarts 柱形图的单击事件中写入自定义的参数
IIS7.5支持解析读取.json文件数据 -- 问题
VS SVN
WebApi 跨域问题解决方案:CORS
SQL Server2012中的SequenceNumber尝试
Oracle数据类型与.NET中的对应关系
MongoDB 学习 --转
MongoDB 基础
CSS魔法堂:你真的懂text-align吗?
原文地址:https://www.cnblogs.com/sunkang/p/2038832.html
最新文章
Whats the benefit of passing a CancellationToken as a parameter to Task.Run?(转载)
利用.NET Core中的Worker Service,来创建windows服务或linux守护程序
玩转ASP.NET Core中的日志组件(链接)
C#: Thread.Sleep vs. Task.Delay (转载)
C#中如何使用异步lambda表达式来初始化委托实例
SQL Server在简单恢复模式下,为什么有时候日志文件还是会增长得很快且很大?(转载)
C#中AppDomain.CurrentDomain.BaseDirectory及各种路径获取方法(转载)
C#程序如何设置只能开一个,不能多开(链接)
Sql Server 关于SET IDENTITY_INSERT的问题 (转载)
原创教程:《metasploit新手指南》介绍及下载
热门文章
Python黑帽编程 3.4 跨越VLAN
每周一书-《模糊测试-强制发掘安全漏洞的利器》
每周一书-《程序开发心理学(银年纪念版)》获奖公布
Python黑帽编程 3.3 MAC洪水攻击
每周一书-2016年8月28日到9月4日获奖读者公布
每周一书-《程序开发心理学(银年纪念版)》
Python黑帽编程 3.2 ARP监控
每周一书-编写高质量代码:改善C程序代码的125个建议
Python黑帽编程 3.1 ARP欺骗
JavaScript 获取鼠标点击位置坐标
Copyright © 2011-2022 走看看