最小表示法算法详解
最小表示法用于寻找循环字符串中字典序最小的唯一表示。例如字符串 “abca” 的循环同构形式包括 “abca”、“bcaa”、“caab” 和 “aabc”,其中最小的是 “aabc”。
算法思想
使用双指针 i
和 j
比较不同起点,通过跳过无效比较将时间复杂度优化至 O(n)。
- 初始化:
i=0
,j=1
,k=0
。 - 比较字符:若
s[i+k] > s[j+k]
,则i += k+1
(i
开头的序列不可能更小);反之j += k+1
。 - 处理平局:若字符相等,
k++
;若k == n
说明整个字符串由重复周期构成,终止比较。 - 结果:取
i
和j
中较小的值作为起点。
图形示例
以 s = "bcabca"
为例(索引从0开始):
索引:0 1 2 3 4 5
字符:b c a b c a
- 初始状态:
i=0
,j=1
,k=0
- 比较
s[0]
vss[1]
→b
>c
→i = 0+0+1 = 1
- 比较
- 新状态:
i=1
,j=1
→j++
→j=2
,k=0
- 比较
s[1]
vss[2]
→c
>a
→i = 1+0+1 = 2
- 比较
- 新状态:
i=2
,j=2
→j++
→j=3
,k=0
- 比较
s[2]
vss[3]
→a
<b
→j = 3+0+1 = 4
- 比较
- 继续比较:
i=2
,j=4
,k=0
s[2]
vss[4]
→a
<c
→j = 4+0+1 = 5
- 最终比较:
i=2
,j=5
,k=0
s[2]
vss[5]
→a
==a
→k=1
s[3]
vss[0]
→b
<b
后的循环处理…- 最终确定最小起点为
i=2
,对应字符串"abcabc"
的最小表示"abcbca"
?
(实际步骤可能更复杂,需逐字符比较)
代码实现(Python)
def minimum_representation(s):
n = len(s)
if n == 0:
return -1