Eu acho que esse é o algoritmo mais simples (com O ( n3) Tempo, n comprimento das cordas)
Percorra string1e string2, para cada personagem, verifique com que frequência ele pode ser encontrado em string1e 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 stringin [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.