Если я правильно понимаю, у вас есть входная строка, и вы рассматриваете все повороты.Например, N поворотов строки длиной N будет, например:
rotations("abcd") -> ["abcd"*, "dabc", "cdab", "bcda"]
Вы хотите написать функцию компаратора compare(rotation1, rotation2)
, которая скажет, является ли rotation1
<или> или == rotation2
, в контексте , что * исходное вращение было abcd
или, альтернативно, иметь функцию key(rotation)
, которая эквивалентна вышеупомянутой функции компаратора.
Если этоневерно, уточните вопрос.=) Если это правильно, ваш ответ будет следующим:
original = 'abcd'
letterPositions = defaultdict(set)
for i,letter in enumerate(original):
letterPositions[letter].add(i)
def numIndicesRotated(rotated):
possibilities = set(range(len(original)))
for i,letter in enumerate(rotated):
possibilities &= {(j-i)%len(original) for j in letterPositions[letter]}
if len(possibilities)==1: #optimization
break #optimization
if len(possibilities)==1:
return possibilities.pop()
else:
raise Exception('not a rotation')
Обратите внимание, что вращения не могут быть чисто неупорядоченными, если у вас есть строка, которая имеет вращения, которые сами по себе, например, abcabc
.
Тогда вы можете сделать что-то вроде sorted(myRotations, key=numIndicesRotated)