Digamos que e são duas cadeias do mesmo comprimento. Uma anagrama de duas strings é um mapeamento bijetivo modo que para cada .b 1 b 2 … b n p : [ 1 … n ] → [ 1 … n ] a i = b p ( i ) i
Pode haver mais de uma anagrama para o mesmo par de cordas. Por exemplo, se `abcab` temos e , entre outros.b = p 1 [ 1 , 2 , 3 , 4 , 5 ] → [ 4 , 5 , 1 , 2 , 3 ] p 2 [ 1 , 2 , 3 , 4 , 5 ] → [ 2 , 5 , 1 , 4 , 3 ]cabab
Vamos dizer que o peso de um anagramador é o número de cortes que se deve fazer na primeira string para obter pedaços que podem ser reorganizados para obter a segunda string. Formalmente, esse é o número de valores de para os quais . Ou seja, ele é o número de pontos em que é que não aumentam por exatamente 1.Para exemplo, e , porque cortes uma vez, para os pedaços e , e cortes quatro vezes, em cinco pedaços.p i ∈ [ 1 … n - 1 ] p ( i ) + 1 ≠ p ( i + 1 ) p w ( p 1 ) = 1 w ( p 2 ) = 4 p 1 p 212345
123
45
12345
Suponha que exista uma anagrama para duas seqüências e . Então, pelo menos uma anagrama deve ter menos peso. Digamos que este seja o mais leve . (Pode haver vários anagramas mais leves; não me importo porque estou interessado apenas nos pesos.)b
Questão
Eu quero um algoritmo que, dadas duas seqüências para as quais existe uma anagrama, produz eficientemente o peso exato da anagrama mais leve das duas seqüências. Tudo bem se o algoritmo também produzir uma anagrama mais leve, mas não precisa.
É uma questão bastante simples gerar todos os anagramas e pesá-los, mas pode haver muitos, então eu preferiria um método que encontre diretamente os anagramas leves.
Motivação
A razão pela qual esse problema é interessante é a seguinte. É muito fácil fazer o computador pesquisar no dicionário e encontrar anagramas, pares de palavras que contêm exatamente as mesmas letras. Mas muitos dos anagramas produzidos são desinteressantes. Por exemplo, os exemplos mais longos encontrados no Segundo Dicionário Internacional do Webster são:
colecistoduodenostomia
duodeno- colecistostomia
O problema deve ser clara: estas são desinteressantes porque eles admitem um anagramming muito leve que simplesmente troca o cholecysto
, duedeno
e stomy
seções, para um peso de 2. Por outro lado, este exemplo muito mais curto é muito mais surpreendente e interessante:
litoral
secional
Aqui, a anagrama mais leve tem peso 8.
Eu tenho um programa que usa esse método para localizar anagramas interessantes, ou seja, aqueles para os quais todos os anagramas são de alto peso. Mas faz isso gerando e pesando todos os anagramas possíveis, o que é lento.
cholecystoduodenostomy
é ccddeehlmnooooossttuyy
.) Duas palavras são anagramas se e somente se elas tiverem a mesma forma canônica. Você armazena as palavras em uma tabela de hash, codificada por suas formas canônicas, e sempre que encontra uma colisão, você tem um anagrama.