Eu acho que esse é o algoritmo mais simples (com O ( n3) Tempo, n comprimento das cordas)
Percorra string1
e string2
, para cada personagem, verifique com que frequência ele pode ser encontrado em string1
e string2
. Se um personagem está mais freqüentemente em uma sequência do que na outra, não é uma permutação. Se as frequências de todos os caracteres forem iguais, as cordas são permutações uma da outra.
Aqui está um pedaço de python para tornar isso 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)
O programa precisa de alguns ponteiros para cordas ( string
, string1
, string2
, char
, char1
, char2
) e variáveis de tamanhoO ( logn )para contar ( count1
, count2
). Ele precisa verificar se os caracteres são iguais ou não, mas a Dows não precisa de nenhuma ordem nesses caracteres. Talvez seja necessário algumas variáveis para números inteiros pequenos (por exemplo, para manter valores booleanos ou para representar a posição de string
in [string1, string2]
.
Claro que você nem precisa das variáveis de contagem, mas pode usar ponteiros.
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 precisa de variáveis semelhantes às do primeiro, exceto que não precisa do O ( log( N ) )variáveis de tamanho para manter os valores de contagem.
Portanto, na verdade, não depende de n ou o tamanho do alfabeto.