Наибольшая общая подстрока

Материал из testwiki
Перейти к навигации Перейти к поиску

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

Формально, наибольшей общей подстрокой строк s1,s2,…sn называется строка w∗, которая удовлетворяет условию ‖w∗‖=max⁡({‖w‖|w⊑si,i=1,…n}), операция w⊑si обозначает что строка w является (возможно несобственной) подстрокой строки si.

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

{A0j=0,j=0…n,Ai0=0,i=0…m,Aij=0,s1[i]≠s2[j],i≠0,j≠0,Aij=Ai−1j−1+1,s1[i]=s2[j],i≠0,j≠0.

Максимальное число Auv в таблице это и есть длина наибольшей общей подстроки, сама подстрока:

s1[u−Auv+1]…s1[u] и s2[v−Auv+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).

См. также

Примечания

Шаблон:ПримечанияШаблон:СтрокиШаблон:Нет ссылок