Как проверить, есть ли какой-либо элемент массива в другом массиве? - PullRequest
0 голосов
/ 15 февраля 2019

У меня есть строка aabbccddffgg Мне нужно проверить, есть ли в нем хотя бы один элемент из массива: ["bb", "cc"].

Каков наилучший способ сделать это в D?

1 Ответ

0 голосов
/ 15 февраля 2019

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) без какого-либо выделения памяти.

Конечно, естьеще более эффективные подходы с более продвинутыми алгоритмами сопоставления строк.

...