Як надрукувати LCS двох рядків?

2024 Від admin

Щоб знайти кількість спільних підпослідовностей у двох рядках, скажімо S і T, ми використовуйте динамічне програмування, визначивши двовимірний масив dp[][], де dp[i][j] — це кількість загальних підпослідовностей у рядку S[0…i-1] і T[0…. j-1].

використання fputs() Функцію fputs() можна використати для виведення двох рядків у C без пробілу між ними, оскільки вона не передає керування на новий рядок, тож навіть якщо інший рядок буде надруковано після нього, обидва вони будуть в одному рядку.

Друк найдовшої спільної підпослідовності

  1. Побудуйте L[m+1][n+1], використовуючи кроки, описані в попередній публікації.
  2. Значення L[m][n] містить довжину LCS. Створіть масив символів lcs[] довжини, що дорівнює довжині lcs плюс 1 (один додатковий для зберігання \0).
  3. Перейдіть по двовимірному масиву, починаючи з L[m][n].

У підході табуляції ми оголосили масив dp і dp[n][m] матиме довжину найдовшої спільної підпослідовності., тобто dp[n][m] = 3. Тепер, за допомогою двох вкладених циклів, якщо ми надрукуємо масив dp, він виглядатиме так: тут dp[5][5] дає нам довжину найдовшого спільна підпослідовність: 3.

  1. Розбийте/розділіть обидва рядки на список слів.
  2. Створіть дерево суфіксів першого списку слів … це O(W^2) .. дерево суфіксів забезпечить оптимізацію будь-якого загального пошуку суфіксів.
  3. Тепер перейдіть до другого списку слів. і спробуйте зіставити ці слова (більше 2 слів) у попередньо створеному дереві суфіксів.

Рядок — це підпослідовність даного рядка, яку генерує видалення деякого символу заданого рядка без зміни його порядку. Часова складність цього підходу становить O(2^n), де n — довжина даного рядка. Це тому, що для рядка довжиною n ми генеруємо загалом 2^n підпослідовностей.