Mam dużą liczbę ciągów. Dla moich celów dwa łańcuchy są równoważne, jeśli jedno jest obrotem drugiego (np. "1234" jest równoważne "3412").Gdy łańcuchy są równoważne do obrotu
Jaki jest skuteczny sposób przetwarzania każdego ciągu dokładnie raz (do obrotu) w języku Python?
Naiwny realizacja tego, co chcę, może wyglądać następująco:
class DuplicateException(Exception): pass
seen = set()
for s in my_strings:
try:
s2 = s+s
for t in seen:
# Slick method I picked up here in SO
# for checking whether one string is
# a rotation of another
if len(s) == len(t) and t in s2:
raise DuplicateException()
seen.add(s)
process(s)
except DuplicateException: pass
To jest O (n²) na ciąg, można go obliczyć znacznie szybciej, patrz Wikipedia "Leksykograficznie minimalna rotacja ciągów" –
@ FalkHüffner, coś musiało być! – Akavall
Wystarczy dodać link do wpisu, który zasugerował Falk Hüffner: http://en.wikipedia.org/wiki/Lexicographically_minimal_string_rotation –