字符串的最小表示法
定义:如果一个字符串可以循环:如0011
→1001
→1100
→0110
具有这种性质的字符串,那么它一定有一种或者多种最小表示法使得该字符串的字典序最小。
解法:
设三个指针i,j,k;初始化i=0
,j=1
,k=0
;先找到 i+k 和 j+k 的第一个不同的位置下标,那么不同位置之前一定不是最小表示法,因为两个不相等一定有一个比较小,比较更新 i 或者 j 即可。
show code:
int getmin(char *s)
{
int len=strlen(s);
int i=0,j=1,k=0,t;
while(i<len && j<len && k<len){
t=s[(i+k)%len]-s[(j+k)%len];
if (!t) k++;
else{
if (t>0) i=i+k+1;
else j=j+k+1;
if (i==j) j++;
k=0;
}
}
return i<j?i:j;
}