Введение
В информатике, самая длинная общая подстрока двух или более строк — это самая длинная строка, являющаяся подстрокой каждой из них. Может существовать несколько самых длинных общих подстрок. Области применения включают дедупликацию данных и обнаружение плагиата.
In computer science, a longest common substring of two or more strings is a longest string that is a substring of all of them. There may be more than one longest common substring. Applications include data deduplication and plagiarism detection.
Определение проблемы
Имеются две строки длины *m* и длины *n*. Найдите самую длинную строку, являющуюся подстрокой обеих строк.
Обобщением является задача о *k* общих подстроках. Дано множество строк , где . Для каждого *i* найдите самую длинную строку, которая встречается как подстрока как минимум в *k* строках.
A generalization is the k common substring problem. Given the set of strings , where and Find for each , a longest string which occurs as substring of at least strings.
Алгоритмы
Можно найти длины и начальные позиции самых длинных общих подстрок строк *x* и *y* за время *O(n)* с помощью обобщенного суффиксного дерева. Более быстрый алгоритм может быть достигнут в модели вычислений RAM, если размер входного алфавита *Σ* равен *σ*. В частности, этот алгоритм работает за время *O(n)*, используя *O(n)* пространства. Решение проблемы с помощью динамического программирования стоит *O(n^2)*. Решения обобщенной задачи занимают *O(n^2)* пространства и *O(n^2)* времени с динамическим программированием и занимают *O(n)* времени с обобщенным суффиксным деревом.
Дерево суффиксов
Самые длинные общие подстроки набора строк можно найти, построив обобщенное дерево суффиксов для этих строк, а затем найдя самые глубокие внутренние узлы, у которых есть листовые узлы, представляющие все строки в поддереве под ними. На рисунке справа представлено дерево суффиксов для строк "ABAB", "BABA" и "ABBA", дополненных уникальными терминаторами строк, чтобы получились строки "ABAB$0", "BABA$1" и "ABBA$2". У узлов, представляющих "A", "B", "AB" и "BA", есть потомки, представляющие все три строки, пронумерованные 0, 1 и 2. Построение дерева суффиксов занимает времени (если размер алфавита постоянен). Если дерево обходить снизу вверх, используя битовый вектор, указывающий, какие строки встречаются под каждым узлом, задачу поиска k общих подстрок можно решить за времени. Если дерево суффиксов подготовлено для быстрого поиска наименьшего общего предка за постоянное время, то задачу можно решить за времени.