A ferramenta de similaridade de strings toma duas strings de texto, String A e String B, que por padrão são kitten e sitting, e calcula no navegador a distância de edição de Levenshtein entre as duas. A cada tecla o resultado se recalcula ao vivo: três cartões de estatística imprimem a distância, a porcentagem de similaridade e a contagem de operações, como 3, 57.1% e 7 por padrão, e abaixo há uma barra de progresso e um roteiro de edição numerado e colorido por tipo, que lista cada passo do primeiro caractere ao último. Tudo é uma passada de programação dinâmica no navegador sobre as duas strings: nada é enviado a lugar nenhum e não há envio em nenhum ponto.
O que a ferramenta recebe e o que dá
A entrada é dois campos de texto de uma linha, lado a lado, rotulados String A e String B, com fonte monoespaçada, e nada mais é pedido. Os padrões são kitten em A e sitting em B, e as mesmas duas palavras aparecem como os marcadores dos campos. A saída é três cartões em fila: a distância como inteiro puro, a similaridade como porcentagem com um decimal, e a contagem de operações como inteiro puro. Abaixo dos cartões, uma barra de progresso enche até a mesma porcentagem, e uma lista rolável imprime o roteiro de edição completo, cada linha numerada de 1, cada uma colorida por seu tipo: substituição em amarelo, inserção em azul, exclusão em vermelho, e coincidência na cor atenuada do texto. Não há botão: o resultado se recalcula enquanto você digita, porque todo o cálculo é uma leitura com memória dos dois valores dos campos.
Como a distância é calculada
A distância é a distância de Levenshtein clássica, construída com uma tabela de programação dinâmica de (comprimento de A + 1) por (comprimento de B + 1) células. Cada célula toma o mínimo de três vizinhas mais um custo: a célula de cima mais um, que é uma exclusão; a célula da esquerda mais um, que é uma inserção; e a diagonal mais um custo de zero quando os dois caracteres são iguais e um quando não, que é uma coincidência ou uma substituição. A comparação é caractere por caractere e diferencia maiúsculas, então K e k são caracteres diferentes. Para os padrões, kitten contra sitting, a tabela é 7 por 8, 56 células, e a célula de baixo à direita lê 3: substituir a k por uma s, substituir a e por uma i, e inserir a g. book contra back é 2, as duas posições do o; flaw contra lawn é 2, a exclusão do f e a inserção do n no final.
O que a lista de operações mostra
A lista é um retrocesso pela tabela terminada, caminhando do canto de baixo à direita até o de cima à esquerda. Em cada passo, o percurso prefere uma coincidência quando os dois caracteres atuais são iguais, depois uma substituição, depois uma inserção, e depois uma exclusão, e os passos recolhidos são impressos invertidos, do primeiro ao último. Esse percurso dá um roteiro de edição mínimo válido, não o único: escolhas diferentes de mesmo custo num empate dariam outra lista do mesmo comprimento. As coincidências também vão na lista, então a contagem de operações é o comprimento do roteiro, não a distância. kitten contra sitting imprime 7 operações para uma distância de 3, as quatro coincidências sendo i, t, t e n; kitten contra si mesma imprime 6 operações, todas coincidências, para uma distância de 0; flaw contra lawn imprime 5, as duas edições mais três coincidências.
Como a porcentagem de similaridade é lida
A porcentagem é o comprimento maior menos a distância, dividido pelo comprimento maior, vezes cem, impresso com um decimal. Para os padrões, 7 menos 3 sobre 7, lê 57.1%, que cai na faixa amarela: o número e a barra ficam verdes com 70 ou mais, amarelos com 40 ou mais, e vermelhos abaixo de 40. Strings idênticas leem 100.0% com distância 0. Uma única inversão de maiúscula, Kitten contra kitten, é uma distância de 1 sobre um comprimento de 6, lendo 83.3%. Um acento conta como uma diferença de caractere: café contra cafe é distância 1, lendo 75.0%. E um par de substituição conta como duas unidades, então o emoji em a😀b contra ab é uma distância de 2, lendo 50.0%.
Quando o resultado fica vazio
Se qualquer campo está vazio depois do recorte, o resultado é null e nada abaixo das duas entradas se renderiza: nem cartões, nem barra, nem lista. Os espaços em branco dentro ou nas bordas não são cortados da comparação, só são usados para checar o vazio, então um espaço final é uma edição: key com um espaço final contra key é uma distância de 1, lendo 75.0% sobre o comprimento de 4. Contra uma string vazia, a distância é o comprimento inteiro do outro lado, por isso abc contra o lado vazio calcula 3 e 0.0%, ainda que a página não o mostre enquanto o campo continua vazio.
Quão longas podem ser as strings
Não há limite de comprimento no código. O custo é o tamanho da tabela, (comprimento de A + 1) por (comprimento de B + 1) células, então o trabalho cresce com o produto dos dois comprimentos: kitten contra sitting são 56 células, duas strings de 1,000 caracteres são cerca de um milhão de células, e duas de 10,000 são cem milhões, que a página vai calcular mas devagar. As entradas são campos de uma linha, então strings muito longas são digitadas ou coladas em uma linha.
O que não é
A ferramenta compara, não transforma o texto: para tirar os espaços em branco e as linhas sobrando antes de comparar, use o Limpa Espaços em Branco; para virar uma string de ponta a ponta, isso é o que o Reversor de Texto faz; e para contar caracteres sem uma segunda string, isso é o que o Contador e Analisador de Caracteres faz. Para o passo a passo da ferramenta de reversão, veja a guia de reversão de texto.