Вот алгоритм.Вероятно, он не самый эффективный, но самый лучший, который я мог придумать.
Input:
A string of length n
A list of words
Create a lookup table:
Create a grid M of n x n slots. (1..n, 1..n)
Create a grid W of n x n slots. (1..n, 1..n)
For each starting position i in 1..n:
For each ending position j in i..n:
For each word w:
Find the edit distance d between w and substring (i..j)
If d is less than M[i,j]:
Set M[i,j] to d
Set W[i,j] to w
Find the best words for each position:
Create a list L of (n+1) slots. (0..n)
Create a list C of (n+1) slots. (0..n)
Set L[0] to 0
For each ending position i in 1..n:
Set L[i] to infinity
For each starting position j in 0..i-1:
If L[j] + M[i,j] is less than L[i]:
Set L[i] to L[j] + M[i,j]
Set C[i] to j
Create the final result string:
Create a list R
Let i be the length of the input (n)
Repeat while i > 0:
Let j be C[i]
Prepend W[j,i] to R
Set i to j-1
Return R
Этот алгоритм разбит на три этапа:
Первый этапвычисляет таблицу соответствия. M - лучшая стоимость вложения любого слова в подстроку i .. j . W - это слово, связанное с этой стоимостью. O ( n 3 мВт ) ( n = длина входа, w =максимальная длина слова и m = количество слов)
Второй этап находит лучшие слова для каждой позиции. L - лучшая общая стоимость до позиции i . C - начальная позиция последнего слова, связанного с этой стоимостью. O ( n 2 )
На последнем этапе выполняется сборка последней строки. R - список слов, который получает наименьшую стоимость при сопоставлении с входной строкой. O ( n ).
Первый этап является наиболее дорогостоящим.Вероятно, должно быть возможно сбрить на порядок на порядок, но я не понимаю, как.Вы также можете комбинировать это со стадией 2, но вы не получите от этого большой выгоды.