Как уже говорилось, проблема решается довольно простым алгоритмом:
Просто просмотрите вводимый текст последовательно с самого начала и проверьте каждое слово: находится оно в ключе поиска или нет. Если слово находится в ключе, добавьте его в конец структуры, которую мы назовем Текущий блок . Текущий блок - это просто линейная последовательность слов, каждое слово сопровождается позицией, в которой оно было найдено в тексте. Текущий блок должен поддерживать следующее свойство : самое первое слово в текущем блоке должно присутствовать в текущем блоке один раз и только один раз. Если вы добавляете новое слово в конец текущего блока, и указанное выше свойство нарушается, вы должны удалить самое первое слово из блока. Этот процесс называется нормализация текущего блока. Нормализация - это потенциально итеративный процесс, поскольку после удаления самого первого слова из блока новое первое слово также может нарушать свойство, поэтому вам придется также удалить его. И так далее.
Таким образом, в основном текущий блок представляет собой последовательность FIFO: новые слова поступают в правый конец и удаляются в процессе нормализации из левого конца.
Все, что вам нужно сделать, чтобы решить проблему, это просмотреть текст, сохранить текущий блок, нормализовать его при необходимости, чтобы он удовлетворял свойству. Самый короткий блок со всеми ключевыми словами, которые вы когда-либо создавали, является ответом на проблему.
Например, рассмотрим текст
CxxxAxxxBxxAxxCxBAxxxC
с ключевыми словами A, B и C. Просматривая текст, вы построите следующую последовательность блоков
C
CA
CAB - all words, length 9 (CxxxAxxxB...)
CABA - all words, length 12 (CxxxAxxxBxxA...)
CABAC - violates The Property, remove first C
ABAC - violates The Property, remove first A
BAC - all words, length 7 (...BxxAxxC...)
BACB - violates The Property, remove first B
ACB - all words, length 6 (...AxxCxB...)
ACBA - violates The Property, remove first A
CBA - all words, length 4 (...CxBA...)
CBAC - violates The Property, remove first C
BAC - all words, length 6 (...BAxxxC)
Лучший построенный нами блок имеет длину 4, что в данном случае является ответом
CxxxAxxxBxxAxx CxBA xxxC
Точная сложность этого алгоритма зависит от входных данных, так как он диктует, сколько итераций сделает процесс нормализации, но без учета нормализации сложность будет тривиально равна O(N * log M)
, где N
- это количество слов в text, M
- количество ключевых слов, а O(log M)
- сложность проверки, принадлежит ли текущее слово к набору ключевых слов.
Теперь, сказав это, я должен признать, что подозреваю, что это может быть не то, что вам нужно. Поскольку вы упомянули Google в заголовке, возможно, формулировка проблемы, которую вы задали в своем посте, неполна. Может быть, в вашем случае текст проиндексирован? (С индексированием вышеупомянутый алгоритм все еще применим, только становится более эффективным). Может быть, есть какая-то хитрая база данных, которая описывает текст и позволяет найти более эффективное решение (например, не просматривая весь текст)? Я могу только догадываться, а ты не говоришь ...