Ho un numero elevato di stringhe. Per i miei scopi, due stringhe sono equivalenti se una è una rotazione dell'altra (ad esempio "1234" equivale a "3412").Quando le stringhe sono equivalenti fino alla rotazione
Che cos'è un modo efficiente per elaborare ogni stringa esattamente una volta (fino alla rotazione) in Python?
Un ingenuo realizzazione di ciò che voglio potrebbe essere simile:
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
Questo è O (n²) per stringa, in realtà puoi calcolarlo molto più velocemente, vedi Wikipedia "Rotazione delle stringhe lessicograficamente minima" –
@ FalkHüffner, doveva esserci qualcosa! – Akavall
Basta aggiungere il link al post suggerito da Falk Hüffner: http://en.wikipedia.org/wiki/Lexicographically_minimal_string_rotation –