Digamos que y b 1 b 2 ... b n son dos cadenas de la misma longitud. Una anagramación de dos cadenas es un mapeo biyectivo p : [ 1 ... n ] → [ 1 ... n ] tal que a i = b p ( i ) para cada i .
Puede haber más de un anagrama para el mismo par de cadenas. Por ejemplo, si `abcab` yb = tenemos p 1 [ 1 , 2 , 3 , 4 , 5 ] → [ 4 , 5 , 1 , 2 , 3 ] y p 2 [ 1 , 2 , 3 , 4 , 5 ] → [ 2 , 5 , 1cabab
, entre otros.
Diremos que el peso de una anagramación p es el número de cortes que uno debe hacer en la primera secuencia para obtener trozos que se pueden reorganizar para obtener la segunda secuencia. Formalmente, este es el número de valores de i ∈ [ 1 … n - 1 ] para los cuales p ( i ) + 1 ≠ p ( i + 1 ) . Es decir, es el número de puntos en los que p no no aumentar en un ejemplo exactamente 1.Para, w ( p y w ( p 2 ) = 4 , porque p 1 cortesuna vez, en los trozosy, y p 2 cortescuatro veces, en cinco trozos.12345
123
45
12345
Supongamos que existe un anagrama para dos cadenas y b . Entonces, al menos un anagrama debe tener menos peso. Digamos que este es el más ligero . (Puede haber múltiples anagramaciones más ligeras; no me importa porque solo estoy interesado en las pesas).
Pregunta
Quiero un algoritmo que, dadas dos cadenas para las cuales existe un anagramación, produzca eficientemente el peso exacto de la anagramación más ligera de las dos cadenas. Está bien si el algoritmo también produce un anagrama más ligero, pero no es necesario.
Es bastante simple generar todos los anagramas y pesarlos, pero puede haber muchos, por lo que preferiría un método que encuentre directamente los anagramas ligeros.
Motivación
La razón por la cual este problema es de interés es la siguiente. Es muy fácil hacer que la computadora busque en el diccionario y encuentre anagramas, pares de palabras que contienen exactamente las mismas letras. Pero muchos de los anagramas producidos no son interesantes. Por ejemplo, los ejemplos más largos que se encuentran en el Segundo Diccionario Internacional Webster son:
colecistoduodenostomía
duodenocolecistostomía
El problema debe quedar claro: estos son poco interesantes porque admiten un anagramico muy ligero que el simple intercambio del cholecysto
, duedeno
y stomy
secciones, para un peso de 2. Por otro lado, este ejemplo mucho más corto es mucho más sorprendente e interesante:
sección costera
Aquí el anagrama más ligero tiene peso 8.
Tengo un programa que utiliza este método para localizar anagramas interesantes, a saber, aquellos para los cuales todos los anagramas son de alto peso. Pero lo hace generando y sopesando todos los anagramas posibles, lo cual es lento.
cholecystoduodenostomy
es ccddeehlmnooooossttuyy
). Dos palabras son anagramas si y solo si tienen la misma forma canónica. Usted almacena las palabras en una tabla hash, tecleadas por sus formas canónicas, y cada vez que encuentra una colisión, tiene un anagrama.