A типичный алгоритм будет выглядеть следующим образом со строковыми индексами в диапазоне от 0 до M-1.
Возвращает либо позицию совпадения, либо -1, если не найден.
foreach hpos in range 0 thru len(haystack)-len(needle):
found = true
foreach npos in range 0 thru len(needle):
if haystack[hpos+npos] != needle[npos]:
found = false
break
if found:
return hpos
return -1
Он имеет разумную производительность, так как он проверяет только столько символов в каждой позиции стога сена, сколько необходимо, чтобы обнаружить, что нет шансов на совпадение.
Это не обязательно самый эффективный алгоритм, но если ваш интервьюер ожидает, что вы знаете все высокопроизводительные алгоритмы, вы нереалистичны (то есть дураки). Хороший разработчик хорошо знает основы, и как найти продвинутый материал , где необходимо (например, когда есть проблемы с производительностью, не раньше).
Диапазон производительности между O (a) и O (ab) зависит от фактических данных в строках, где a и b - длины стога и сена соответственно.
Одним из возможных улучшений является сохранение в цикле npos первого местоположения, большего, чем hpos, где символ соответствует первому символу стрелки.
Таким образом, вы можете пропустить hpos вперед в следующей итерации, поскольку знаете, что до этого момента возможного совпадения не может быть. Но опять же, это может быть необязательно, в зависимости от ваших требований к производительности. Вы должны выработать баланс между скоростью и ремонтопригодностью самостоятельно.