我有字符串aabbccddffgg
我需要检查它是否有最后一个元素来自数组:["bb", "cc"]
。
D中最好的方法是什么?
find
和canFind
支持可变数量的针,因此使用它们是最简单的:
"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)中懒惰地发生而没有任何内存分配。
当然,还有更高效的方法和更先进的字符串匹配算法。