辞書をトライとして保存している場合、文字を挿入、削除、または置換できる最も一致するエントリを見つけるかなり簡単な方法があります。
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」などの接尾辞については、接尾辞だけを含む別のトライがあり、ほとんどの単語はその接尾辞トライにリンクできます。そうすれば、「反国有化」などの奇妙な言葉を扱うことができます。