Dadas dos cadenas, ¿cómo puede verificar si son una permutación entre sí utilizando el espacio O (1)? No se permite modificar las cadenas de ninguna manera.
Nota: O (1) espacio en relación con la longitud de la cadena Y el tamaño del alfabeto.
algorithms
strings
space-complexity
Anónimo
fuente
fuente
O(log n)
para cadenas de longitud n que no es constante por medio de la longitud ni del tamaño del alfabeto. Cuando las cadenas se pueden modificar temporalmente, creo que hay una solución con un mayor alfabeto que es lineal en el tamaño del alfabeto pero constante en la longitud de la cadena en un modelo logarítmico.Respuestas:
El enfoque ingenuo sería construir histogramas de ambas cadenas y verificar si son iguales. Dado que no se nos permite almacenar una estructura de datos de ese tipo (cuyo tamaño sería lineal al tamaño del alfabeto) que podría calcularse en una pasada, necesitamos contar las ocurrencias de cada símbolo posible después de la otra:
Por supuesto, esto supone que los recuentos y los índices de iterador son enteros de tamaño constante, en lugar de depender de la longitud de las cadenas.
fuente
O(n * min(n, |Σ|))
. Hm, ahora que lo pienso, suena bastante como la solución "permitido repetir" de tu respuesta, ¿no?count
no esO(1)
(es decir, puede desbordarse)count
era unint
:-) Sí, no funcionaría, pero en Java eso no puede suceder de todos modosDenote las matrices por y suponga que son de longitud n .A,B n
Supongamos primero que los valores en cada matriz son distintos. Aquí hay un algoritmo que usa espacio :O(1)
Calcule los valores mínimos de ambas matrices y verifique que sean idénticas.
Calcule los segundos valores mínimos de ambas matrices y verifique que sean idénticos.
Y así.
Calcular el valor mínimo de una matriz usa claramente el espacio . Dado el k -ésimo elemento más pequeño, podemos encontrar el ( k + 1 ) st elemento más pequeño al encontrar el valor mínimo mayor que el k -ésimo elemento más pequeño (aquí usamos el hecho de que todos los elementos son distintos).O(1) k ( k + 1 ) k
Cuando se permite que los elementos se repitan, modificamos el algoritmo de la siguiente manera:
Calcule los valores mínimos de ambas matrices, cuente cuántas veces aparecen cada uno y verifique m A , 1 = m B , 1 y que los recuentos sean idénticos.metroA , 1, mB , 1 metroA , 1= mB , 1
Calcule los valores mínimos más grandes que m A , 1 , m B , 1 en las dos matrices (respectivamente), y cuente cuántas veces aparecen cada una. Verifique que m A , 2 = m B , 2 y que los recuentos sean idénticos.metroA , 2, mB , 2 metroA , 1, mB , 1 metroA , 2= mB , 2
Y así.
fuente
Defina alguna función f (c) que asigne algún carácter c a un número primo único (a = 2, b = 3, c = 5, etc.).
Simplemente declarar que puede usar una función de mapeo de números primos es un poco manual, y muy probablemente donde surja un problema manteniendo el espacio .O (1)
fuente
Puedes hacer esto esO(nlogn)
. Ordene las dos cadenas y compárelas índice por índice. Si difieren en alguna parte, no son permutaciones entre sí.Para una
O(n)
solución, se podría usar hashing. Esta función de hashing funcionaría, ye
para cualquier letra sería su valor ascii. Si los dos hashes de las cadenas difieren, no son permutaciones entre sí.La función hash en el enlace:
El uso de doble hashing (o para exagerar aún más) cambiando el valor de R los identificaría con éxito como permutaciones con muy alta probabilidad.
fuente
Digamos que tiene dos cadenas llamadas syt.
Puede usar heurísticas para asegurarse de que no sean desiguales.
Después de esto, puede ejecutar fácilmente un algoritmo para demostrar que las cadenas son iguales.
Por supuesto, no puede ordenar tan rápido si no se le permite usar espacio adicional. Por lo tanto, no importa qué algoritmo elija: cada algoritmo que necesite se ejecutará en tiempo O (n ^ 2) cuando solo haya espacio O (1) y si la heurística no pudo demostrar que no pueden ser iguales.
fuente
En código de estilo C para toda la rutina:
O en pseudocódigo muy detallado (usando indexación basada en 1)
donde la función checkLetters (A, B, i) verifica que si hay M copias de A [i] en A [1] .. A [i], entonces hay al menos M copias de A [i] en B:
y la función findNextValue busca en B un valor que comience desde un índice y devuelve el índice donde se encontró (o n + 1 si no se encuentra).
fuente
Creo que este es el algoritmo más simple (conO ( n3 ) hora, norte longitud de cuerdas)
Recorre
string1
ystring2
, para cada personaje, comprueba con qué frecuencia se puede encontrar enstring1
ystring2
. Si un personaje está más a menudo en una cadena que en la otra, no es una permutación. Si las frecuencias de todos los caracteres son iguales, entonces las cadenas son permutaciones entre sí.Aquí hay una pieza de pitón para hacer esto preciso
El programa necesita algunos punteros a cadenas (O ( logn ) para contar (
string
,string1
,string2
,char
,char1
,char2
) y las variables de tamañocount1
,count2
). Debe verificar si los caracteres son iguales o no, pero no necesita ningún orden en estos caracteres. Tal vez necesita algunas variables para enteros pequeños (por ejemplo, para mantener valores booleanos o para representar la posición destring
in[string1, string2]
.Por supuesto, ni siquiera necesita las variables de conteo, pero puede usar punteros.
Este segundo programa necesita variables similares al primero, excepto que no necesita elO ( log( n ) ) variables de tamaño para mantener los valores de conteo.
Por lo tanto, en realidad no depende denorte o el tamaño del alfabeto.
fuente