Учитывая две последовательности, выведите самую длинную подпоследовательность, присутствующую в обеих.
Примеры:
LCS для входных последовательностей «ABCDGH» и «AEDFHR» — это «ADH» длины 3.
LCS для входных последовательностей «AGGTAB» и «GXTXAYB» — это «GTAB» длины 4.
Мы обсуждали проблему Longest Common Subsequence (LCS) в предыдущем посте . Обсуждаемая функция была в основном для определения длины LCS. Чтобы найти длину LCS, была построена двухмерная таблица L [] []. В этом посте обсуждается функция построения и печати LCS.
Ниже приведен подробный алгоритм печати LCS. Он использует ту же 2D таблицу L [] [].
1) Постройте L [m + 1] [n + 1], используя шаги, описанные в предыдущем посте .
2) Значение L [m] [n] содержит длину LCS. Создайте массив символов lcs [] длиной, равной длине lcs плюс 1 (один дополнительный для сохранения / 0).
2) Перейдите 2D массив, начиная с L [m] [n]. Делайте следующее для каждой ячейки L [i] [j]
… .. a) Если символы (в X и Y), соответствующие L [i] [j], одинаковы (или X [i-1] == Y [j-1]), то включите этот символ как часть LCS ,
… .. b) В противном случае сравните значения L [i-1] [j] и L [i] [j-1] и перейдите в направлении большего значения.
В следующей таблице (взято из Wiki ) показаны шаги (выделены), за которыми следует приведенный выше алгоритм.
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | ||
---|---|---|---|---|---|---|---|---|---|
Ø | M | Z | J | A | W | X | U | ||
0 | Ø | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1 | X | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
2 | M | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
3 | J | 0 | 1 | 1 | 2 | 2 | 2 | 2 | 2 |
4 | Y | 0 | 1 | 1 | 2 | 2 | 2 | 2 | 2 |
5 | A | 0 | 1 | 1 | 2 | 3 | 3 | 3 | 3 |
6 | U | 0 | 1 | 1 | 2 | 3 | 3 | 3 | 4 |
7 | Z | 0 | 1 | 2 | 2 | 3 | 3 | 3 | 4 |
Ниже приводится реализация вышеуказанного подхода.
|
Джава
|
питон
|
C #
|
PHP
|
Выход:
LCS of AGGTAB and GXTXAYB is GTAB
Ссылки:
http://en.wikipedia.org/wiki/Longest_common_subsequence_problem
Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме
Рекомендуемые посты:
- Печать самой длинной общей подпоследовательности | Комплект 2 (Печать всех)
- Печать самой длинной битовой подпоследовательности
- Построение самой длинной увеличивающейся подпоследовательности (LIS) и печать последовательности LIS
- Самая длинная общая подпоследовательность | ДП-4
- Самая длинная общая подпоследовательность анаграммы
- Самая длинная общая подпоследовательность, допускающая не более k изменений
- LCS (самая длинная общая подпоследовательность) из трех строк
- Программа на C ++ для самой длинной общей подпоследовательности
- Самая длинная общая возрастающая подпоследовательность (LCS + LIS)
- Самая длинная общая подпоследовательность | DP с использованием Memoization
- Самая длинная подпоследовательность с хотя бы одной общей цифрой в каждом элементе
- Программа Python для самой длинной общей подпоследовательности
- Java-программа для самой длинной общей подпоследовательности
- Самая длинная общая подпоследовательность с разрешенными перестановками
- Самая длинная общая подпоследовательность анаграммы из N строк
0.00 (0%) 0 votes