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

Dmi*_*kov 3 d

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

D中最好的方法是什么?

gre*_*ify 5

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

"aabbccddffgg".canFind("bb", "cc");
Run Code Online (Sandbox Code Playgroud)

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

auto eles = ["bb", "cc"];
eles.any!(e => "aabbccddffgg".canFind(e)))
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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