最小(最大)表示法

最小表示法是求与某个字符串循环同构的所有字符串中,字典序最小的串是哪个。比如说一个字符串jdrakioi,它长为8,也就是说最多有八种循环同构的方法。jdrakioi、drakioij、rakioijd、akioijdr、kioijdra、ioijdrak、oijdraki、ijdrakio。这几个串在原串上的开始位置分别是0,1,2,3,4,5,6,7。

首先 我们 定义三个变量 i j,k 分别表示 从下标i和下标j开始有k个字符相同

所以当 s[i]==s[j]时就有 k++;

当 s[i]>s[j]时 就说明 以i开头的字符串不能可能是最小表示 则 i=i+k+1;

反之则 j=j+k+1;

int get_min(string s){
    int len=s.length();
    int i=0; int j=1; int k=0;
    while(i<len&&j<len&&k<len){
        int t=s[(i+k)%len]-s[(j+k)%len];
        if(!t) k++;
        else{
            if(t>0) i+=(k+1); //s[i]>s[j] i推进 
            else j+=(k+1);
            if(i==j) j++;
            k=0;
        }
    }
    return i>j?j:i;
}
原文地址:https://www.cnblogs.com/wmj6/p/10516439.html