Ich denke das ist der einfachste Algorithmus (mit O ( n3) Zeit, n Länge der Saiten)
Durchlaufe string1
und string2
, überprüfe für jeden Charakter, wie oft er in string1
und zu finden iststring2
. Wenn ein Zeichen in einer Zeichenfolge häufiger vorkommt als in der anderen, handelt es sich nicht um eine Permutation. Wenn die Frequenzen aller Zeichen gleich sind, sind die Zeichenfolgen Permutationen voneinander.
Hier ist ein Stück Python, um dies zu präzisieren
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)
Das Programm benötigt einige Hinweise auf Strings ( string
, string1
, string2
, char
, char1
, char2
) und Variablen der GrößeO ( logn )zum Zählen ( count1
, count2
). Es muss überprüft werden, ob die Zeichen gleich sind oder nicht, aber es muss keine Reihenfolge für diese Zeichen festgelegt werden. Vielleicht braucht es einige Variablen für kleine ganze Zahlen (zB um boolesche Werte zu speichern oder die Position von string
in darzustellen[string1, string2]
.
Natürlich brauchen Sie nicht einmal die Zählvariablen, sondern können Zeiger verwenden.
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)
Dieses zweite Programm benötigt ähnliche Variablen wie das erste, außer dass es das nicht benötigt O ( log( n ) )-size Variablen zum Speichern der Zählwerte.
Also kommt es eigentlich nicht darauf an n oder die Größe des Alphabets.