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



