find
и canFind
поддерживают различное количество игл, поэтому использовать их проще всего:
"aabbccddffgg".canFind("bb", "cc");
Подробнее о std.algorithm.searching.canНайдите здесь ,Если вы не знаете количество игл в время компиляции , это будет немного зависеть от того, сколько вы знаете о строке, но наивный подход заключался бы в многократном зацикливании строки:
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 здесь .Эта же идея работает и в общем случае:
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) без какого-либо выделения памяти.
Конечно, естьеще более эффективные подходы с более продвинутыми алгоритмами сопоставления строк.