Creo que este es el algoritmo más simple (con O ( n3) hora, norte longitud de cuerdas)
Recorre string1
y string2
, para cada personaje, comprueba con qué frecuencia se puede encontrar en string1
y string2
. 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
s1="abcaba"
s2="aadbba"
def check_if_permutations(string1, string2):
for string in [string1, string2]:
# string references string1
# string2, it is not a copy
for char in string:
count1=0
for char1 in string1:
if char==char1:
count1+=1
count2=0
for char2 in string2:
if char==char2:
count2+=1
if count1!=count2:
print('unbalanced character',char)
return()
print ("permutations")
return()
check_if_permutations(s1,s2)
El programa necesita algunos punteros a cadenas ( string
, string1
, string2
, char
, char1
, char2
) y las variables de tamañoO ( logn )para contar ( count1
, 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 de string
in [string1, string2]
.
Por supuesto, ni siquiera necesita las variables de conteo, pero puede usar punteros.
s1="abcaba"
s2="aadbba"
def check_if_permutations(string1, string2):
for string in [string1, string2]:
# string references one of string1
# or string2, it is not a copy
for char in string:
# p1 and p2 should be views as pointers
p1=0
p2=0
while (p1<len(string1)) and (p2<len(string2)):
# p1>=len(string1): p1 points to beyond end of string
while (p1<len(string1)) and (string1[p1]!=char) :
p1+=1
while(p2<len(string2)) and (string2[p2]!=char):
p2+=1
if (p1<len(string1)) != (p2<len(string2)):
print('unbalanced character',char)
return()
p1+=1
p2+=1
print ("permutations")
return()
check_if_permutations(s1,s2)
Este segundo programa necesita variables similares al primero, excepto que no necesita el O ( log( n ) )variables de tamaño para mantener los valores de conteo.
Por lo tanto, en realidad no depende de norte o el tamaño del alfabeto.