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

Материал из testwiki
Версия от 08:23, 11 марта 2020; imported>Я123 (Checkwiki #1. Исправление избыточного префикса "Шаблон:")
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Перейти к навигации Перейти к поиску

Наибольшая общая подстрока (Шаблон: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).

См. также

Примечания

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