Supponiamo che e siano due stringhe della stessa lunghezza. Un anagramma di due stringhe è una mappatura biiettiva p: [1 \ ldots n] \ a [1 \ ldots n] tale che a_i = b_ {p (i)} per ogni i .b 1 b 2 … b na i = b p ( i )
Potrebbe esserci più di un anagramma per la stessa coppia di stringhe. Ad esempio, se `abcab` cabab
abbiamo e , tra gli altri.
Diremo che il peso di un anagramma è il numero di tagli che uno deve fare nella prima stringa per ottenere pezzi che possono essere riorganizzati per ottenere la seconda stringa. Formalmente, questo è il numero di valori di per cui . Cioè, è il numero di punti in cui non non aumentano con esattamente 1.For esempio, e , perché tagli 12345
volta, nei pezzi 123
e 45
, e tagli 12345
quattro volte, in cinque pezzi.
Supponiamo che esista un anagramma per due stringhe e . Quindi almeno un anagramma deve avere meno peso. Diciamo che questo è il più leggero . (Potrebbero esserci più anagrammature più leggere; non mi interessa perché sono interessato solo ai pesi.)
Domanda
Voglio un algoritmo che, dati due stringhe per le quali esiste un anagramma, produce in modo efficiente il peso esatto dell'anagramma più leggero delle due stringhe. Va bene se l'algoritmo produce anche un anagramma più leggero, ma non è necessario.
È abbastanza semplice generare tutti gli anagramm e pesarli, ma potrebbero essercene molti, quindi preferirei un metodo che trova direttamente gli anagramm.
Motivazione
La ragione per cui questo problema è interessante è la seguente. È molto facile fare in modo che il computer cerchi nel dizionario e trovi anagrammi, coppie di parole che contengono esattamente le stesse lettere. Ma molti degli anagrammi prodotti non sono interessanti. Ad esempio, gli esempi più lunghi che si possono trovare nel secondo dizionario internazionale di Webster sono:
duodenocholecystostomy colecistoduodenostomia
Il problema dovrebbe essere chiaro: sono poco interessante perché ammettono un'anagrammi molto leggero che semplicemente scambi il cholecysto
, duedeno
e stomy
le sezioni, per un peso di 2. D'altra parte, questo esempio molto più breve è molto più sorprendente e interessante:
costa
sezionale
Qui l'anagramma più leggero ha un peso di 8.
Ho un programma che utilizza questo metodo per individuare anagrammi interessanti, vale a dire quelli per i quali tutti gli anagrammi sono di peso elevato. Ma lo fa generando e pesando tutti i possibili anagrammi, che è lento.
cholecystoduodenostomy
è ccddeehlmnooooossttuyy
.) Due parole sono anagrammi se e solo se hanno la stessa forma canonica. Memorizzi le parole in una tabella hash, codificata dalle loro forme canoniche e ogni volta che trovi una collisione, hai un anagramma.