O que é um anagrama
Um anagrama é simplesmente uma palavra ou frase formada ao rearranjar todas as letras de outra, usando cada uma exatamente uma vez. Nada mais. O termo vem do grego ana-gramma, que significa literalmente "re-escrever", mas isso não muda a prática. Vou explicar como isso funciona de verdade, porque a definição de dicionário não mostra onde as pessoas travam na hora de construir os próprios.
Precisamente o que conta como anagrama
Todo anagrama válido preserva a contagem de cada letra. Escuta vira tsuce se você não remover o acento, mas em anagramas legítimos o acento segue a vogal e a equivalência é entre escuta e tucesse — na prática, o mais comum é tratar apenas o núcleo alfabético, ou seja, letras sem acentos e sem espaços. A regra básica é: remove espaços, remova acentos, transforma tudo em minúsculas, ordena as letras e compara. Se duas strings produzirem a mesma sequência ordenada, são anagramas. Se alguma letra sobrar ou faltar, não é anagrama. Acabou a parte teórica.
Como eu construo e verifico anagramas no dia a dia
Minha rotina costuma ser diferente do jogo de tabuleiro. Eu preciso de verificação rápida em lote, não de adivinhação manual. O fluxo que funciona é esse.
- Montei um dicionário limpo com palavras de 4 a 12 letras, tudo em minúsculas, sem acentos, sem hífen, sem números.
- Para cada palavra, gerei a signature: o conjunto de letras ordenado alfabeticamente. cafe vira acef. faca também vira acef.
- Agrupei as palavras pela signature em um hash map. Cada chave aponta para uma lista de anagramas daquela família.
- Na hora de buscar, basta normalizar a entrada e consultar a chave. Tempo de busca gira em torno de microssegundos, não importa o tamanho do dicionário.
O cálculo da signature custa O(L log L) por palavra, onde L é o tamanho da string. Para um dicionário brasileiro médio de 300 mil entradas, o pré-processamento leva menos de dois segundos em Python rodando local, dependendo da máquina. A memória consumida é pequena: uns poucos megabytes para as chaves e os arrays de palavras agrupadas.
Um problema real que ninguém avisa
Eu tive um caso específico em que a abordagem padrão falhou feio. Estava processando nomes próprios com hífen e crase, tipo João-Luís e Ana Paula. A normalização ingênua de apenas remover espaços criou colisão: jao-luis virava jaloisu e jao Luis virava jaloisu também. Anagramas falsos apareciam em massa, e o bug só foi percebido quando os logs começaram a mostrar matches impossíveis de nomes que nunca haviam sido citados juntos. O workaround foi simples, mas exige cuidado. Eu passei a tratar cada token individualmente, gerando signatures por palavra e depois juntando-as com um separador fixo, como o caractere zero-width space, para preservar a fronteira entre palavras. Ou, quando o objetivo era apenas anagrama de palavra única, eu rejeitava entradas com hífen e mantinha o dicionário restrito a tokens sem pontuação interna. A verificação ficou correta, e o ruído caiu para praticamente zero.
👉 Clique no botão abaixo para saber mais sobre o assunto!
Pegadinhas comuns que confundem iniciante
As pessoas costumam errar em três pontos. O primeiro é achar que anagrama permite repetir letras que não existem na origem. Não permite. Se a palavra original tem um e, o anagrama também tem exatamente um e. O segundo erro é tratar acentos como letras diferentes. Em português, é e e são a mesma letra na prática de anagramas. A normalização por NFD seguida da remoção dos diacríticos é mais segura do que um simple replace de acentos fixos, porque cobre variants que você nem imagina que existem num corpus real.
O terceiro erro é esquecer que espaços e pontuações não contam. “O rato roeu” e “rouco atemor” podem ser candidatos se as letras forem idênticas após a limpeza. Mas aí entra a quarta dificuldade, que é semântica: anagrama é uma propriedade puramente letteral, não faz sentido exigir coerência do conteúdo. Isso é vantagem e desvantagem ao mesmo tempo.
Quando anagrama não resolve
Existem limites que valem a pena saber antes de investir tempo. Anagramas perfeitos são raros para palavras curtas em português, porque a frequência de letras é muito assimétrica. s, a, o, r, e dominam o mapa. Palavras com letras raras, como x, k, w, ou vogais fechadas menos frequentes, tendem a produzir famílias pequenas. Em alguns casos, a família tem apenas a palavra original, ou seja, não existe anagrama lexical válido. Outro problema prático é a ambiguidade de textos longos. Quanto maior a string de entrada, maior o número de combinações permutacionais, mas o filtro por dicionário é o que limita o resultado. Se seu objetivo é criativo, a restrição de dicionário pode tornar a busca lenta porque você precisa atravessar milhares de candidatos antes de achar algo aceitável. Nesse cenário, a técnica que eu recomendo é inverter o problema: em vez de permutar a entrada, gere signatures a partir do dicionário e faça lookup direto. Isso elimina a explosão combinatória e converte a busca de tempo exponencial para tempo quase constante após o pré-processamento.
Implementação mínima que funciona
Eu costumo começar com algo assim, só para validar a ideia antes de montar estruturas maiores. A função de assinatura remove espaços, normaliza acentos via NFD, elimina diacríticos, lowercased e ordena. O agrupamento usa defaultdict(list). A consulta é direta: normaliza a entrada e acessa a chave. Se a chave não existir, a lista é vazia. Não há mágica, e essa é exatamente a beleza do método.
Onde usar e onde evitar
Anagramas funcionam bem em validação de dados, testes de integridade leve, jogos de palavra e exercícios de criptografia educacional. Eles não funcionam bem como mecanismo de segurança. Hashes de anagrama são previsíveis, colidem intencionalmente e não oferecem nenhuma propriedade criptográfica. Se você precisa de integridade ou autenticidade, use HMAC ou assinaturas digitais. Anagrama serve para divertisse, para analisar padrões lexicais e para problemas de correspondência exata de letras, não para proteger informação. Se o seu caso envolve frases grandes com liberdade criativa, considere alternar para análise de frequência de caracteres com tolerância a pequenas variações, ou use ferramentas de geração assistida por modelo que respeitem restrições de léxico. O anagrama puro, quando exigido, vai travar em palavras com poucas famílias e gerar uma sensação de impossibilidade que não reflete a complexidade real do problema, mas sim a escassez de opções lexicais disponíveis no dicionário escolhido.
No final, o que vale a pena reter é a simplicidade da signature. Ela transforma um problema aparentemente combinatorial em um problema de agrupamento. O resto é escolha de dicionário, regra de normalização e tratamento dos casos de borda que aparecem quando você para de tratar o texto como coisa abstrata e passa a lidar com a sujeira real dos dados.