字符串最小表示是指一个给定一个字符串,从特定的为止开始比如说abc可以使bca也可以是cab在这些表示中间,abc是字典序最小的,则abc就是这个字符串的最小表示。字符串最小表示的暴力方法很容易想,就是枚举每一个位置的字符为起始字符,分别比较字典序大小。而我们今天要讨论的是一个O(n)的算法,在线性时间内找到一个字符串的最小表示比如说一个字符串bacad我们一样去找字符串的初始位置,只是不再去全部枚举完所有的字符,比如说,我们知道b>a那么第一个位置肯定不是字符串最小表示的位置,而在两个a的地方,我们需要往下比较,因为c<d所以,第二个a也不是最小表示的位置,以此类推,最后可以确定一个最小表示的开始位置
View Code
1 int minr(char *s) 2 { 3 int i=0,j=1,k=0; 4 int l=strlen(s); 5 while(i<l&&j<l&&k<l) 6 { 7 if(s[(i+k)%l]==s[(j+k)%l]) 8 k++; 9 else 10 { 11 if(s[(i+k)%l]>s[(j+k)%l]) 12 { 13 i+=(k+1); 14 if(i==j) 15 i++; 16 } 17 else 18 { 19 j+=(k+1); 20 if(i==j) 21 j++; 22 } 23 k=0; 24 } 25 } 26 return min(i,j); 27 }