在字典上找到最小的字符串旋转是一个众所周知的问题,让·皮埃尔·杜瓦尔(Jean Pierre Duval)于1983年提出了一种线性时间算法。该博客文章可能是唯一详细讨论该算法的可公开获得的资源。但是,Duval的算法基于成对比较(“ duels”)的概念,并且博客方便地使用偶数长度的字符串作为示例。
该算法如何处理奇数长度的字符串,而最后一个字符将不会与之竞争。
一个角色可以赢得“ 再见 ”,而无需参加“决斗”就可以获胜。算法的正确性不取决于您执行的特定对决。给定 任意 两个不同的索引 i 和 j ,您始终可以得出结论,排除其中之一是字典最小旋转的起始索引(除非 两者 都是 相同的 起始索引) __字典最小旋转,在这种情况下,您拒绝哪一个旋转都没有关系。 按特定顺序执行决斗的原因是性能:通过确保一半的决斗只需要比较一个字符,其余一半的只需要比较两个字符来获得渐近线性时间,依此类推,直到最后一次决斗只需要比较字符串长度的一半即可。但是,这里和那里的单个奇数字符不会改变渐近复杂性,它只会使数学(和实现)更加复杂。长度为2 n +1的字符串仍然需要比长度2 n +1更少的“决斗” 。