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
;
}
查看全文
相关阅读:
spring各个版本开发包下载
not value specified for parameter问题解决方案
Ajax的重构
Ajax中与服务器的通信【发送请求与处理响应】
Ajax技术之XMLHttpRequest(二)【XMLHttpRequest常用方法和属性】
“AI”项目日记
英语学习笔记
贺费德勒20冠,和关于程序员中年危机的思考
《领域驱动设计:软件核心复杂性应对之道》读书笔记
ERP系统知识笔记
原文地址:https://www.cnblogs.com/sunkang/p/2038832.html
最新文章
反射工厂糗事
I/O之输出流 OutputStream类
IO流-输入输出
迭代器iterator(三):Listlterator遍历arraylist,并用逆序输出结果
迭代器 iterator(二): 用iterator遍历arraylist
python2 与python3的变化
python3 python2 import 的区别
git 分支操作
git 使用
交叉熵
热门文章
Spring aop 注解参数说明
python multiprocessing.Process
http1.0 的哑代理问题
pyshark 得到payload
记录Mac下安装pyenv时所遇到的问题
使用spring的特殊bean完成分散配置
JAVA多线程常用例子
spring之继承配置
Spring中集合注入方法
struts2.0自定义类型转换
Copyright © 2011-2022 走看看