Исходя из размера вашей заявленной проблемы, я не буду беспокоиться об оптимизации этого решения вообще, поскольку все, кроме экспоненциального, будет работать мгновенно. Я приведу только алгоритм, который, я уверен, может дать такой же правильный ответ, какой вы могли бы ожидать для такой нечеткой задачи, как эта. Тогда мы можем работать над его оптимизацией.
Во-первых, вам нужна любая эвристическая функция f, которая берет слово w и возвращает ближайшее слово или не соответствует.
Тогда вы просто генерируете множество всех возможных w в вашей строке. В худшем случае это означает, что нужно взять набор всех строк длины 1, затем длины 2, затем длины 3 до длины вашей строки. Общее число сгенерированных таким образом w будет около (n * n-1) / 2
Если вы беспокоитесь о скорости, вы можете установить максимальную длину слова, и стоимость генерации ws снизится до линейной по длине вашей строки.
Возьмите свой набор слов и выведите каждое из них по очереди в f, вы можете использовать любую эвристику, которую хотите определить, какие слова выбираются в качестве реальных слов из вашего словаря, или что делать, когда выбранные слова перекрываются. Простая реализация может отсортировать все слова по начальному буквенному индексу, и в любое время f возвращает совпадение, пропуская буквы до конца выбранного слова.