Если у вас есть словарь, сохраняемый как три, есть довольно простой способ найти наиболее подходящие записи, где символы могут быть вставлены, удалены или заменены.
void match(trie t, char* w, string s, int budget){
if (budget < 0) return;
if (*w=='\0') print s;
foreach (char c, subtrie t1 in t){
/* try matching or replacing c */
match(t1, w+1, s+c, (*w==c ? budget : budget-1));
/* try deleting c */
match(t1, w, s, budget-1);
}
/* try inserting *w */
match(t, w+1, s + *w, budget-1);
}
Идея в том, что сначала вы звоните с нулевым бюджетом и смотрите, распечатывает ли он что-нибудь. Затем попробуйте бюджет 1 и т. Д., Пока не будут распечатаны некоторые совпадения. Чем больше бюджет, тем больше времени. Возможно, вы захотите увеличить бюджет только до 2.
Добавлено: не так уж сложно расширить это для обработки общих префиксов и суффиксов. Например, английские префиксы, такие как «un», «anti» и «dis», могут быть в словаре, а затем могут ссылаться на верхнюю часть словаря. Для суффиксов, таких как «ism», «s» и «ed», может быть отдельный три, содержащий только суффиксы, и большинство слов могут ссылаться на этот суффикс. Тогда он может обрабатывать странные слова, такие как «антинационализация».