如何检查另一个数组中是否有数组元素?

问题描述 投票:3回答:1

我有字符串aabbccddffgg我需要检查它是否有最后一个元素来自数组:["bb", "cc"]

D中最好的方法是什么?

d
1个回答
5
投票

findcanFind支持可变数量的针,因此使用它们是最简单的:

"aabbccddffgg".canFind("bb", "cc");

了解有关std.algorithm.searching.canFind here的更多信息。如果您在编译时不知道针数,则取决于您对字符串的了解程度,但天真的方法是在字符串上多次循环:

auto eles = ["bb", "cc"];
eles.any!(e => "aabbccddffgg".canFind(e)))

如果您对子元素有更多了解,那么有更好的方法。例如,如果您知道所有针的长度均为n,则可以创建一个大小为n的滑动窗口,并检查您的针是否出现在其中一个滑动窗口中:

auto eles = ["bb", "cc"];
"aabbccddffgg".slide(2).canFind!(e => eles.canFind!equal(e));

了解有关std.range.slide here的更多信息。同样的想法也适用于一般情况:

auto eles = ["bb", "cc"];
string s = "aabbccddffgg";
s.enumerate
   .map!(e => s.drop(e.index))
   .canFind!(e => eles.canFind!(reverseArgs!startsWith)(e));

请注意,drop使用切片并在O(1)中懒惰地发生而没有任何内存分配。

当然,还有更高效的方法和更先进的字符串匹配算法。

© www.soinside.com 2019 - 2024. All rights reserved.