Je pense que c'est l'algorithme le plus simple (avec O ( n3) temps, n longueur des cordes)
Parcourez string1
et string2
, pour chaque personnage, vérifiez la fréquence à laquelle il peut être trouvé dans string1
et string2
. Si un personnage est plus souvent dans une chaîne que dans l'autre, ce n'est pas une permutation. Si les fréquences de tous les caractères sont égales, les chaînes sont des permutations les unes des autres.
Voici un morceau de python pour rendre cela précis
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)
Le programme a besoin de quelques pointeurs vers des chaînes ( string
, string1
, string2
, char
, char1
, char2
) et les variables de tailleO ( logn )pour compter ( count1
, count2
). Il doit vérifier si les caractères sont égaux ou non, mais il n'a besoin d'aucun ordre sur ces caractères. Peut-être qu'il a besoin de certaines variables pour les petits entiers (par exemple pour contenir des valeurs booléennes ou pour représenter la position de string
in [string1, string2]
.
Bien sûr, vous n'avez même pas besoin des variables de comptage, mais vous pouvez utiliser des pointeurs.
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)
Ce deuxième programme a besoin de variables similaires à la première, sauf qu'il n'a pas besoin du O ( log( n ) )-taille variables pour conserver les valeurs de comptage.
Donc, cela ne dépend pas n ou la taille de l'alphabet.