背景
Sunday 算法是 Daniel M.Sunday 于 1990 年提出的字符串模式匹配。
其效率在匹配随机的字符串时比其他匹配算法还要更快。Sunday 算法的实现可比 KMP,BM 的实现容易太多。
算法过程
假定主串为 "HERE IS A SIMPLE EXAMPLE",模式串为 "EXAMPLE"。
(1)
2018世界顶尖交易员量化投资巡讲·深圳站
全球唯一的四次夺得
“罗宾斯杯”世界交易锦标赛冠军的殿堂级大师
意大利人安德烈·昂格尔来华首次工作坊式演讲
零距离体验到一个真正获得业界高度认可的
顶级程序化交易员的交易艺术
2018年 1月20-21日 中国·深圳
咨询电话/微信:18516600808
从头部开始比较,发现不匹配。则 Sunday 算法要求如下:找到主串中位于模式串后面的第一个字符,即红色箭头所指的 “空格”,再在模式串中从后往前找“空格”,没有找到,则直接把模式串移到“空格” 的后面。
(2)
(3)
找到匹配。
完整代码
/**
*
* author : 刘毅(Limer)
* date : 2017-07-30
* mode : C++
*/
#
include
#
include
#
define
MAX
_
CHAR
256
#
define
MAX
_
LENGTH
1000
using
namespace
std
;
void
GetNext
(
string
&
p
,
int
&
m
,
int
next
[])
{
for
(
int
i
=
0
;
i
MAX_CHAR
;
i
++
)
next
[
i
]
= -
1
;
for
(
int
i
=
0
;
i
m
;
i
++
)
next
[
p
[
i
]]
=
i
;
}
void
Sunday
(
string
&
s
,
int
&
n
,
string
&
p
,
int
&
m
)
{
int
next
[
MAX_CHAR
];
GetNext
(
p
,
m
,
next
);
int
j
;
// s 的下标
int
k
;
// p 的下标
int
i
=
0
;
while
(
i
<=
n
-
m
)
{
j
=
i
;
k
=
0
;
while
(
j
n
&&
k
m
&&
s
[
j
]
==
p
[
k
])
j
++
,
k
++
;
if
(
k
==
m
)
cout
<
"在"
<
i
<
" 处找到匹配\n"
;
if
(
i
+
m
n
)
i
+=
(
m
-
next
[
s
[
i
+
m
]]);
else
return
;
}
// PS: 匹配失败不作处理
}
int
main
()
{
string
s
,
p
;
int
n
,
m
;
while
(
cin
>>
s
>>
p
)
{
n
=
s
.
size
();
m
=
p
.
size
();
Sunday
(
s
,
n
,
p
,
m
);
cout
<
endl
;
}
return
0
;
}
数据测试如下图:
来源:
https://www.61mon.com/index.php/archives/213/
盈利才是硬道理
abc战法每日解盘视频直播(限时免费一周)
李陈亮老师受电台邀请,在电台解盘视频直播一年,分析当前行情及指导未来操作方法。
每周一到周五,晚上八点半到九点,学员可以与李老师互动答疑。
【价格】:1580元
立即联系下面的微信号,可以申请免费试看一周。
电话/微信:18516600808