Обработка строк — это важная часть алгоритмов и структур данных, которая находит широкое применение в текстовых редакторах, биоинформатике, поисковых системах и многих других областях. Два ключевых алгоритма, которые часто используются при обработке строк, — это нахождение наибольшей общей подпоследовательности (LCS, Longest Common Subsequence) и расстояние Левенштейна.
1. Нахождение наибольшей общей подпоследовательности (LCS)
Описание задачи:
Задача нахождения наибольшей общей подпоследовательности состоит в том, чтобы найти наибольшую последовательность символов, которая присутствует в двух строках, не обязательно подряд. В отличие от подстроки, символы в подпоследовательности не обязательно должны идти подряд, но должны сохранять порядок.
Пример:
Для строк X = "ABCBDAB" и Y = "BDCABB" наибольшая общая подпоследовательность будет LCS(X, Y) = "BCAB".
Алгоритм:
Для решения задачи используется динамическое программирование. Мы строим таблицу, в которой элемент dp[i][j] будет хранить длину наибольшей общей подпоследовательности для первых i символов строки X и первых j символов строки Y.
-
Если символы строк совпадают (
X[i] == Y[j]), то длина LCS на позицииdp[i][j]будет равна длине LCS дляdp[i-1][j-1]плюс 1. -
Если символы не совпадают (
X[i] != Y[j]), то длина LCS на позицииdp[i][j]будет равна максимальной длине из двух предыдущих позиций:dp[i-1][j]иdp[i][j-1].
Сложность:
-
Время: O(m * n), где
m— длина первой строки, аn— длина второй строки. -
Память: O(m * n) для хранения таблицы динамического программирования.
Применение:
-
Сравнение текстов (например, для проверки сходства документов).
-
Сравнение биологических последовательностей (например, для поиска схожих частей ДНК).
-
Вычисление схожести строк в текстовых редакторах.
2. Алгоритм редактирования строк (расстояние Левенштейна)
Описание задачи:
Задача вычисления расстояния Левенштейна заключается в нахождении минимального числа операций (вставки, удаления или замены символов), которые необходимо выполнить для преобразования одной строки в другую.
Пример:
Для строк X = "kitten" и Y = "sitting", минимальное расстояние Левенштейна будет равно 3 (изменить “kitten” на “sitting” можно за 3 операции: заменив k на s, вставив i и заменив e на i).
Алгоритм:
Алгоритм также основан на динамическом программировании. Мы строим таблицу, в которой элемент dp[i][j] будет содержать минимальное количество операций, которые необходимо выполнить для преобразования первых i символов строки X в первые j символов строки Y.
-
Если символы строк совпадают (
X[i-1] == Y[j-1]), тоdp[i][j] = dp[i-1][j-1]. -
Если символы не совпадают, то нужно выбрать минимальную операцию (вставка, удаление или замена):
-
Вставка:
dp[i][j] = dp[i][j-1] + 1 -
Удаление:
dp[i][j] = dp[i-1][j] + 1 -
Замена:
dp[i][j] = dp[i-1][j-1] + 1
-
Сложность:
-
Время: O(m * n), где
mиn— длины строк. -
Память: O(m * n) для хранения таблицы.
Применение:
-
Корректировка текста (например, исправление орфографических ошибок).
-
Похожие строки в текстах, например, при поиске синонимов или при слиянии данных.
-
Поиск схожести между биологическими последовательностями.
-
Применяется в поисковых системах для исправления ошибок ввода.