Если даны две строки X и Y, найдите самую длинную общую подстроку X и Y.
Наивный подход [O (N * M 2 )] и динамическое программирование [O (N * M)] уже обсуждались здесь .
В этой статье мы обсудим линейный временной подход для поиска LCS с использованием дерева суффиксов (Приложение 5- го дерева суффиксов).
Здесь мы построим обобщенное суффиксное дерево для двух строк X и Y, как уже обсуждалось в:
Обобщенное дерево суффиксов 1
Давайте возьмем тот же пример (X = xabxa и Y = babxba), который мы видели в Обобщенном дереве суффиксов 1 .
Мы построили следующее дерево суффиксов для X и Y:

Это обобщенное дерево суффиксов для xabxa # babxba $
Выше листы с индексами суффиксов в [0,4] являются суффиксами строки xabxa, а листы с индексами суффиксов в [6,11] — суффиксами строки babxa. Почему ??
Поскольку в каскадной строке xabxa # babxba $ индекс строки xabxa равен 0, а ее длина равна 5, поэтому индексы ее суффиксов будут 0, 1, 2, 3 и 4. Аналогичным образом индекс строки babxba равен 6, а его длина равна 6. , поэтому индексы его суффиксов будут 6, 7, 8, 9, 10 и 11.
При этом мы можем видеть, что на приведенном выше рисунке дерева обобщенных суффиксов есть некоторые внутренние узлы, имеющие листья под ним от
- обе строки X и Y (т. е. есть по крайней мере один лист с индексом суффикса в [0,4] и один лист с индексом суффикса в [6, 11]
- только строка X (т.е. все листовые узлы имеют индексы суффикса в [0,4])
- только строка Y (т.е. все конечные узлы имеют индексы суффиксов в [6,11])
На следующем рисунке показаны внутренние узлы, помеченные как «XY», «X» или «Y» в зависимости от того, к какой строке принадлежат листья, которые они имеют под собой.
Что означают эти маркировки «XY», «X» или «Y»?
Метка пути от корня до внутреннего узла дает подстроку X или Y или обоих.
Для узла, помеченного как XY, подстрока от корня до этого узла принадлежит обеим строкам X и Y.
Для узла, помеченного как X, подстрока от корня до этого узла принадлежит только строке X.
Для узла, помеченного как Y, подстрока от корня до этого узла принадлежит только строке Y.
Посмотрев на рисунок выше, вы можете увидеть, как получить LCS из X и Y?
К настоящему времени должно быть ясно, что как получить общие подстроки X и Y хотя бы.
Если мы пройдем путь от корня до узлов, помеченных как XY, мы получим общую подстроку X и Y.
Теперь нам нужно найти самую длинную из всех распространенных подстрок.
Вы можете подумать, как получить LCS сейчас? Вспомните, как мы получили Longest Repeated Substring в данной строке, используя дерево суффиксов.
Метка пути от корня до самого глубокого узла, отмеченного как XY, даст LCS для X и Y. Самый глубокий узел выделен на рисунке выше, а метка пути «abx» от корня до этого узла — это LCS для X и Y.
|
Выход:
Longest Common Substring in xabxac and abcabxabcd is: abxa, of length: 4 Longest Common Substring in xabxaabxa and babxba is: abx, of length: 3 Longest Common Substring in GeeksforGeeks and GeeksQuiz is: Geeks, of length: 5 Longest Common Substring in OldSite:GeeksforGeeks.org and NewSite:GeeksQuiz.com is: Site:Geeks, of length: 10 Longest Common Substring in abcde and fghie is: e, of length: 1 Longest Common Substring in pqrst and uvwxyz is: No common substring
Если две строки имеют размер M и N, то для построения Обобщенного суффиксного дерева требуется O (M + N), а поиск LCS представляет собой DFS на дереве, который снова равен O (M + N).
Таким образом, общая сложность линейна во времени и пространстве.
Следовать за:
- Учитывая шаблон, проверьте, является ли это подстрокой X или Y или обоих. Если это подстрока, найдите все ее вхождения, а также к какой строке (X или Y или обе) она принадлежит.
- Расширить реализацию, чтобы найти LCS из более чем двух строк
- Решить задачу 1 для более чем двух строк
- По заданной строке найдите ее длинную палиндромную подстроку
Мы опубликовали следующие дополнительные статьи о приложениях дерева суффиксов:
- Приложение суффиксного дерева 1 — Проверка подстроки
- Suffix Tree Application 2 — Поиск по всем паттернам
- Приложение суффиксного дерева 3 — самая длинная повторяющаяся подстрока
- Suffix Tree Application 4 — построение линейного суффиксного массива времени
- Приложение Suffix Tree 6 — длинная палиндромная подстрока
- Обобщенное дерево суффиксов 1
Эта статья предоставлена Анураг Сингх . Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме
Рекомендуемые посты:
- Приложение Suffix Tree 6 — длинная палиндромная подстрока
- Приложение суффиксного дерева 3 — самая длинная повторяющаяся подстрока
- Приложение суффиксного дерева 1 — Проверка подстроки
- Suffix Tree Application 4 — построение линейного суффиксного массива времени
- Suffix Tree Application 2 — Поиск по всем паттернам
- Самый длинный префикс, который также является суффиксом
- Обзор структур данных | Набор 3 (График, Три, Сегментное дерево и Суффикс-дерево)
- Обобщенное дерево суффиксов 1
- Самая длинная возрастающая подпоследовательность с использованием алгоритма самой длинной общей подпоследовательности
- Поиск по шаблону с использованием дерева суффиксов
- Построение суффикс-дерева Укконена — часть 4
- Построение Суффикса Укконена — Часть 6
- Построение Суффикса Укконена — Часть 5
- Построение Суффикса Укконена — Часть 2
- Построение суффикс-дерева Укконена — часть 1
0.00 (0%) 0 votes