最小表示法是求与某个字符串循环同构的所有字符串中,字典序最小的串是哪个。比如说一个字符串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; }