Найдовший спільний підрядок

Матеріал з testwiki
Версія від 16:23, 24 липня 2024, створена imported>MonxBot (Заміна старих тегів на актуальні аналоги (en:Wikipedia:HTML5))
(різн.) ← Попередня версія | Поточна версія (різн.) | Новіша версія → (різн.)
Перейти до навігації Перейти до пошуку

Найдовший спільний підрядок (Шаблон:Lang-en) — підрядок двох або більше рядків, що має максимальну довжину.

Формально, найдовшим спільним підрядком рядків s1,s2,sn називається рядок w*, що задовольняє умові w*=max({w|wsi,i=1,n}), операція wsi позначає що рядок w є (можливо невласним) підрядком рядка si.

Розв'язання задачі пошуку найдовшого спільного підрядка для двох рядків s1 і s2, довжини яких m і n відповідно, полягає в заповненні таблиці Aij розміром (m+1)×(n+1) за наступним правилом, приймаючи, що символи в рядку нумеруються від одиниці.

{A0j=0,j=0n,Ai0=0,i=0m,Aij=0,s1[i]s2[j],i0,j0,Aij=Ai1j1+1,s1[i]=s2[j],i0,j0.

Максимальне число Auv в таблиці це і є довжина найбільшого спільного підрядка, сам підрядок:

s1[uAuv+1]s1[u] и s2[vAuv+1]s2[v].

У таблиці заповнені значення для рядків SUBSEQUENCE і SUBEUENCS:

   SUBSEQUENCE
  000000000000
S 010010000000
U 002000010000
B 000300000000
E 000001001001
U 001000010000
E 000001002001
N 000000000300
C 000000000040
S 010010000000

Отримуємо найдовший спільний підрядок UENC.

Складність такого алгоритму становить O(mn).

Шаблон:Рядки