这是一个简洁的解决方案,它避免了正则表达式和缓慢的Python内循环:
def principal_period(s):
i = (s+s).find(s, 1, -1)
return None if i == -1 else s[:i]
David Zhang的解决方案无疑是赢家,对于大型示例集,其性能至少比其他同类产品高出5倍。
(那个答案的话,不是我的。)
这是基于这样的观察,即且仅当字符串等于其自身的非平凡旋转时,它才是周期性的。感谢@AleksiTorhamo,他意识到我们可以从s
in的第一次出现的索引中恢复本金周期(s+s)[1:-1]
,并向我通知Python的可选参数start
和end
参数string.find
。