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

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

 

posted @ 2017-07-19 19:59  Dh_q  阅读(248)  评论(0编辑  收藏  举报