循环字符串最小表示法:对于一个首位相连的字符串,寻找一个位置,从这个位置向后形成一个新的字符串,需要使这个字符串字典序最小。
最小表示法的算法思路是维护两个指针i,j。 i指向表示最小的位置,j作为比较指针
令i=0;j=1;k=0;表示从i开始k长度和从j开始k长度的字符串相同(i,j表示当前判断的位置)
最小表示法模板:
int Get_min(char T[])
{
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+=k+1;//i位置数值大
else j+=k+1;
if(i==j)j++;//i,j指针指向同一位置时
k=0;
}
}
return min(i,j);
}
最大表示法模板:
/*最大表示法*/
int Get_max(char T[])
{
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) j+=k+1;//与最小模板比,只有这里和下方变了
else i+=k+1;//
if(i==j)j++;
k=0;
}
}
return min(i,j);
}