Ignorando, por enquanto, a parte SQL do problema, o algoritmo que eu usaria é bastante simples:comece pegando cada palavra em seu dicionário e produzindo uma versão dela com as letras em ordem ordenada, junto com um ponteiro de volta para a versão original dessa palavra.
Isso daria uma tabela com entradas como:
sorted_text word_id
act 123 /* we'll assume `act` was word number 123 in the original list */
act 321 /* we'll assume 'cat' was word number 321 in the original list */
Então, quando recebemos uma entrada (digamos, "tac"), classificamos suas letras, procuramos em nossa tabela de letras classificadas unidas à tabela de palavras originais, e isso nos dá uma lista das palavras que podem ser criadas a partir essa entrada.
Se eu estivesse fazendo isso, eu teria as tabelas para isso em um banco de dados SQL, mas provavelmente usaria outra coisa para pré-processar a lista de palavras no formulário classificado. Da mesma forma, eu provavelmente deixaria a classificação das letras da entrada do usuário para qualquer coisa que eu estivesse usando para criar o front-end, então o SQL seria deixado para fazer o que é bom:gerenciamento de banco de dados relacional.