如何检查另一个数组中数组的任何元素?

时间:2019-02-15 13:51:51

标签: d

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

用D做的最好的方法是什么?

1 个答案:

答案 0 :(得分:5)

findcanFind支持各种数量的针,因此最容易使用它们:

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

详细了解std.algorithm.searching.canFind here。 如果您不知道编译时的针数,则取决于您对字符串的了解程度,但是幼稚的方法是在字符串上循环多次:< / p>

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)中延迟发生而没有任何内存分配。

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