Пусть ∑ - алфавит (например, {A, C, G, T}). Пусть L ⊆ ∑ * - множество коротких библиотечных последовательностей. Вычислить минимальное состояние DFA (Q, ∑, ∂, q 0 , F) для L *.
Мы просканируем длинную последовательность x ∈ ∑ * по одной букве за раз. Пусть x 'будет префиксом x, который был использован. Мы поддерживаем для каждого состояния q ∈ Q минимум c q (x ') над [каждой последовательностью y ∈ ∑ * такой, что ∂ (q 0 , y) = q] расстояния Левенштейна между х 'и у.
Для пустого префикса ε для каждого состояния q ∈ Q справедливо, что c q (ε) = min {| y |: y ∈ ∑ *, ∂ (q 0 *) 1014 *, y) = q}, поскольку расстояние между y и ε равно длине y. Вычислите начальную таблицу с поиском по ширине на графе переходов.
Учитывая таблицу для x 'и букву s, мы вычисляем c q (x) как минимум для нескольких возможностей для y, где x = x s.
Строки y = y's z, выравнивая s. Стоимость в этом случае составляет min q ', z: ∂ (q', sz) = q (c q ' (x') + | z |), что может быть вычисляется с помощью | Q | поиск в ширину.
Строки y = y ', удаляя s в x. Стоимость в этом случае составляет c q (x ') + 1.
Строки y = y 't, где t - буква, заменяющая s на t (или наоборот). Стоимость в этом случае составляет min q ', t: ∂ (q', t) = q (c q ' (x') + 1).
В конце, оптимальная стоимость выравнивания равна min q ∈ F c q (x). Выравнивание может быть восстановлено обычным способом для динамических программ.