对于一个字符串,将其首尾相接,就能得到一个环形字符串。从不同的元素出发绕一圈,就会得到不同的字符串,最小表示法就是将最小的那个字符串输出。
那么,字符串中的小是如何定义的呢?两个字符串从第0个元素开始比较,一旦两个字符串之间出现了不同,哪个字符元素比较小,则它所在的字符串就比较小。
i = 0; j = 1
以i和j为起点出发,就形成了两个不同的字符串,然后以s[(i + k) % len]和s[(j + k) % len] 来逐个比较以i和j为起点形成的字符串。
如果s[i + k] == s[j + k] ,则k++,直到出现不同为止。
如果s[i+k] > s[j + k] ,那么以i为起点的字符串肯定不是最小的,所以就将i移到i + k + 1的位置,
如果s[i+k] < s[j + k],那么j就不是最小的,则需要j = j +k +1;
由于每次都要以i和j为起点比较,所以每次比较出不同的时候,都要令 k = 0。
最后将i和j最小的那个返回即可。
int get_min(char *s)
{
int i=0,j=1,k=0,t,l=strlen(s);
while(i<l&&j<l&&k<l)
{
t=s[(j+k)%l]-s[(i+k)%l];
if(!t)
k++;
else
{
if(t>0)
j=j+k+1;
else
i=i+k+1;
if(i==j)
j++;
k=0;
}
}
return (i<j?i:j);
}
记一个忘了的知识点
昨天从别人的博客复制代码来调试,不管输入什么,都是返回字符串的长度 。最后发现原因竟然是因为我用了fgets读取字符串,因为fgets函数是读取回车的,所以我将读取的字符串作为字符串作为参数传到函数肯定是不对的,因为换行符的ASCII值最小,所以每次得到的答案就是换行符所在的位置,也就是字符串长度(其实算上换行符的话应该是长度减1)。
网友评论