Як надрукувати LCS двох рядків?
2024Щоб знайти кількість спільних підпослідовностей у двох рядках, скажімо S і T, ми використовуйте динамічне програмування, визначивши двовимірний масив dp[][], де dp[i][j] — це кількість загальних підпослідовностей у рядку S[0…i-1] і T[0…. j-1].
використання fputs() Функцію fputs() можна використати для виведення двох рядків у C без пробілу між ними, оскільки вона не передає керування на новий рядок, тож навіть якщо інший рядок буде надруковано після нього, обидва вони будуть в одному рядку.
Друк найдовшої спільної підпослідовності
- Побудуйте L[m+1][n+1], використовуючи кроки, описані в попередній публікації.
- Значення L[m][n] містить довжину LCS. Створіть масив символів lcs[] довжини, що дорівнює довжині lcs плюс 1 (один додатковий для зберігання \0).
- Перейдіть по двовимірному масиву, починаючи з L[m][n].
У підході табуляції ми оголосили масив dp і dp[n][m] матиме довжину найдовшої спільної підпослідовності., тобто dp[n][m] = 3. Тепер, за допомогою двох вкладених циклів, якщо ми надрукуємо масив dp, він виглядатиме так: тут dp[5][5] дає нам довжину найдовшого спільна підпослідовність: 3.
- Розбийте/розділіть обидва рядки на список слів.
- Створіть дерево суфіксів першого списку слів … це O(W^2) .. дерево суфіксів забезпечить оптимізацію будь-якого загального пошуку суфіксів.
- Тепер перейдіть до другого списку слів. і спробуйте зіставити ці слова (більше 2 слів) у попередньо створеному дереві суфіксів.
Рядок — це підпослідовність даного рядка, яку генерує видалення деякого символу заданого рядка без зміни його порядку. Часова складність цього підходу становить O(2^n), де n — довжина даного рядка. Це тому, що для рядка довжиною n ми генеруємо загалом 2^n підпослідовностей.