私は多数の文字列を持っています。私の目的のために、2つの文字列は、一方が他方の回転であれば等価です(例えば、 '1234'は '3412'と等価です)。文字列が回転に等しいとき
Pythonで各文字列を正確に1回(回転まで)処理する効率的な方法は何ですか?
私が何をしたいの素朴な実装は次のようになります。
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
これは文字列ごとにO(n²)ですが、実際にはもっと速く計算することができます。Wikipediaの "Lexicographically minimal string rotation" –
@FalkHüffnerを参照してください。 – Akavall
FalkHüffnerが提案した記事へのリンクを追加するだけです:http://en.wikipedia.org/wiki/Lexicographically_minimal_string_rotation –