Проблема с самой длинной общей подстрокой

Google Translate Icon

Самая длинная общая проблема подстроки — это проблема поиска самой длинной строки (или строк), которая является подстрокой (или подстроками) двух строк.

Задача отличается от задачи поиска Самая длинная общая подпоследовательность (LCS). В отличие от подпоследовательностей, подстроки должны занимать последовательные позиции в исходной строке.

 
Например, самая длинная общая подстрока строк ABABC, BABCA это строка BABC длина 4. Другие распространенные подстроки: ABC, A, AB, B, BA, BC, а также C.

Потренируйтесь в этой проблеме

Наивным решением было бы рассмотреть все подстроки второй строки и найти самую длинную подстроку, которая также является подстрокой первой строки. Временная сложность этого решения будет O((m + n) × m2), куда m а также n длина строк X а также Y, сколько потребуется (m+n) время для поиска подстроки, и есть m2 подстроки второй строки. Мы можем оптимизировать этот метод, рассматривая подстроки в порядке уменьшения их длины и возвращая значение, как только любая подстрока совпадает с первой строкой. Но временная сложность в наихудшем случае остается неизменной, когда отсутствуют общие символы.

Можем ли мы сделать лучше?

Идея состоит в том, чтобы найти самый длинный общий суффикс для всех пар префиксов строк с помощью динамического программирования, используя отношение:

LCSuffix[i][j] = | LCSuffix[i-1][j-1] + 1       (if X[i-1] = Y[j-1])
                 | 0                            (otherwise)
 
where,
 
0 <= i – 1 < m,    where m is the length of string X
0 <= j – 1 < n,    where n is the length of string Y

Например, рассмотрим строки ABAB а также BABA.

Longest Common Substring

Наконец, самая длинная общая длина подстроки будет максимальной из этих самых длинных общих суффиксов всех возможных префиксов.

 
Следующее решение на C++, Java и Python находит длину самой длинной повторяющейся подпоследовательности последовательностей. X а также Y итеративно с использованием оптимальное основание собственность проблема ЛКС.

C++


Скачать  Выполнить код

результат:

The longest common substring is AB

Java


Скачать  Выполнить код

результат:

The longest common substring is AB

Python


Скачать  Выполнить код

результат:

The longest common substring is AB

Временная сложность приведенного выше решения равна O(m.n) и требует O(m.n) дополнительное пространство, где m а также n длина строк X а также Y, соответственно. Пространственная сложность приведенного выше решения может быть улучшена до O(n) поскольку для вычисления LCS строки таблицы LCS требуются только решения для текущей строки и предыдущей строки. Мы также можем хранить в строках только ненулевые значения. Мы можем сделать это, используя хеш-таблицы вместо массивов.

 
Мы также можем решить эту проблему в O(m + n) время с помощью обобщенного суффиксное дерево. Мы скоро обсудим подход суффиксного дерева в отдельном посте.

 
Упражнение: Напишите оптимизированный по пространству код для итеративной версии.
 

Использованная литература: https://en.wikipedia.org/wiki/Longest_common_substring_problem

Оценить этот пост

Средний рейтинг 4.74/5. Подсчет голосов: 202

Голосов пока нет! Будьте первым, кто оценит этот пост.

Сожалеем, что этот пост не оказался для вас полезным!

Расскажите, как мы можем улучшить этот пост?




Спасибо за чтение.

Пожалуйста, используйте наш онлайн-компилятор размещать код в комментариях, используя C, C++, Java, Python, JavaScript, C#, PHP и многие другие популярные языки программирования.

Как мы? Порекомендуйте нас своим друзьям и помогите нам расти. Удачного кодирования :)



Подписывайся
Уведомить о
guest
25 Комментарии
Большинство голосов
Новейшие Самый старый
Встроенные отзывы
Просмотреть все комментарии
НЕ переходите по этой ссылке, иначе вы будете забанены на сайте!