Я думаю, что это самый простой алгоритм (с O ( n3) время, N длина струн)
Цикл string1
и string2
, для каждого символа, проверьте, как часто он может быть найден в string1
и string2
. Если символ находится в одной строке чаще, чем в другой, это не перестановка. Если частоты всех символов равны, то строки являются перестановками друг друга.
Вот кусок питона, чтобы сделать это точным
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)
Программа нуждается в некоторых указателях на строки ( string
, string1
, string2
, char
, char1
, char2
) и переменного размераO ( журналн )для подсчета ( count1
, count2
). Нужно проверить, равны ли символы или нет, но не нужно упорядочивать эти символы. Возможно, для небольших целых чисел нужны переменные (например, для хранения логических значений или для представления позиции string
в [string1, string2]
.
Конечно, вам даже не нужны переменные count, но вы можете использовать указатели.
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)
Эта вторая программа нуждается в переменных, аналогичных первой, за исключением того, что она не нуждается в O ( журнал( н ) )переменные для хранения значений счетчика.
Так что на самом деле это не зависит от N или размер алфавита.