最小表示法(算法)(笔记)

2018-01-14  本文已影响17人  不知名小号

对于一个字符串,将其首尾相接,就能得到一个环形字符串。从不同的元素出发绕一圈,就会得到不同的字符串,最小表示法就是将最小的那个字符串输出。
那么,字符串中的小是如何定义的呢?两个字符串从第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)。

上一篇 下一篇

猜你喜欢

热点阅读