ищите любой «ab», найдите «cd» или «ef» в +1 или -1, продолжайте, пока не будет найдена вся перестановка.
пример:
с использованием "ab", "cd", "ef"
в "asjkdnjdnaboidnabefcdasdnmk"
первый экземпляр "ab"
находится в 9
, таким образом:
lowerFound = 9
upperfound = 11 \\ found index + length of found string
оттуда вы знаете, что любое другое совпадение в перестановке должнолибо перед lowerfound
, либо над upperfound
, поэтому посмотрите на обе стороны, например:
dn ab oi
не содержит совпадений, поэтому отбросьте и найдите следующий "ab"
в 15
lowerFound = 15
upperfound = 17
search for "cd" or "ef" at 15-length or 17
found "ab"+"ef"
lowerFound = 15
upperfound = 19
search for "cd" at 15-length or 19
found "abef"+"cd"
return
Я разработал программу для этого, но она довольно большая, с точки зрения линии, поэтому я поставил ее прямо здесь , не стесняйтесь критиковать этот подход.
Чтобы уменьшить наихудший случай "ababababababababcdef"
вы можете сохранить индекс в памяти, который уже ищется.