字符串的最小表示法(模板)
对于一个循环字符串S,S中存在一种表示方法S' ,使的S' 的字典序最小。
设 S = 3 2 2 4 5
我们只需要2个指针 i, j 和一个参数 k = 0。i= 0, j = 1。
如果 S[i+k] == S[j+k] , k++;
如果 S[i+k] < S[j+k] , j = j+k+1;
如果 S[i+K] > S[i+k] , i = i + k + 1;
i = j , j++;
一开始 3 2。满足S[i+k] > S[j+k] 。所以最小的位置不在 i +k 的地方 ,所以i = i+k+1 = 1。因为 i= j = 1。j++, 还要初始化k = 0;
S[2] = S[3], 所以k++。
S[2+1] < S[3+1]。 j = j+k+1。原因就是:i到i+k的序列为[2, 2], 而 j 到 j + k 的序列为 [2, 4], 所以在[j, j+k] 这段里面都不可能使最小的位置。k初始化。
S[2] < S[5] 。 所以i = 2 使最小S’ 的开始位置。
S' = 2 2 4 5 3
1 int getMinRepresentation(int *s, int n) 2 { 3 int i = 0, j = 1, k = 0; 4 while(i < n && j < n && k < n) 5 { 6 int t = s[(i + k) % n] - s[(j + k) % n]; 7 if(!t) k++; 8 else 9 { 10 if(t > 0) i += k + 1; 11 else j += k + 1; 12 if(i == j) j++; 13 k = 0; 14 } 15 } 16 return i < j ? i : j; 17 }