最小表示法
最小表示法
题目链接:最小表示法
最小表示法就是针对一个字符串,得到其同构循环串的最小字典序的一个
同构循环串:这里可以用一个队列方便理解:比如对于“123456789”,我们不断弹出队头将其放到队尾,得到的字符串即为其同构循环串
为了方便得到其算法,我们可以拿到一个数据进行模拟:
对于数据 2 3 6 5 1 7 8 9 3 0
我们要解决两个问题
①如何存储其所有同构循环串?我们不需要用到队列,只需要将其复制一遍放到其末尾即可。于是就成为了
2 3 6 5 1 7 8 9 3 0 2 3 6 5 1 7 8 9 3 0
②如何得到其最优字符串?假如字符串长度为n,对于s[i],我们很容易知道s[i]-s[i+n]这一段字符串是其一个同构循环串。比较字典序我们需要一个一个进行比较。因此我们可以指定两个指针i=0,j=1,让k从0循环到n,比较s[i+k]和s[j+k],这样子就可以得到其每一位的大小。
1.若s[i+k]>s[j+k],则说明0-i+k的所有字符串均不是最优解,所以i = i+k+1
2.若s[i+k]<s[j+k],则说明0-j+k的所有字符串均不是最优解,所以j = j+k+1
3.若两者相等,则继续循环
4.最后得到的最小的k即为最优解开始的下标
算法是显而易见的,时间复杂度从枚举的O(n^2)变成了O(n),效率是显然的
AC代码
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Qianmo's Blog!