我有一个字符串aabbccddffgg
,我需要检查它是否至少有一个来自数组["bb", "cc"]
的元素。
用D做的最好的方法是什么?
答案 0 :(得分:5)
find
和canFind
支持各种数量的针,因此最容易使用它们:
"aabbccddffgg".canFind("bb", "cc");
详细了解std.algorithm.searching.canFind here。
如果您不知道编译时的针数,则取决于您对字符串的了解程度,但是幼稚的方法是在字符串上循环多次:< / p>
如果您对子元素了解更多,则有更好的方法。
例如,如果您知道所有针的长度均为n,则可以创建一个大小为n的滑动窗口,并检查针是否出现在其中一个滑动窗口中: 详细了解std.range.slide here。
相同的想法在一般情况下也适用: 请注意, 当然,还有更有效的方法和更高级的字符串匹配算法。auto eles = ["bb", "cc"];
eles.any!(e => "aabbccddffgg".canFind(e)))
auto eles = ["bb", "cc"];
"aabbccddffgg".slide(2).canFind!(e => eles.canFind!equal(e));
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)中延迟发生而没有任何内存分配。