字符串的最小表示法(模板)

时间:2021-10-15 22:14:34

对于一个循环字符串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 }