字符串最小表示法(1) 朴素算法
循环字符串的最小表示法的问题可以这样描述:
对于一个字符串S,求S的循环的同构字符串S’中字典序最小的一个。
由于语言能力有限,还是用实际例子来解释比较容易:
设S=bcad,且S’是S的循环同构的串。S’可以是bcad或者cadb,adbc,dbca。而且最小表示的S’是adbc。
对于字符串循环同构的最小表示法,其问题实质是求S串的一个位置,从这个位置开始循环输出S,得到的S’字典序最小。
一种朴素的方法是设计i,j两个指针。其中i指向最小表示的位置,j作为比较指针。
令i=0,j=1
如果S[i] > S[j] i=j, j=i+1
如果S[i] < S[j] j++
如果S[i]==S[j] 设指针k,分别从i和j位置向下比较,直到S[i] != S[j]
如果S[i+k] > S[j+k] i=j,j=i+1
否则j++
返回i
代码如下
int getans(int *S,int lens) { int i=0,j=1,k; while(j!=lens) { if(S[i]>S[j]) i=j,j=i+1; else if(S[i]<S[j]) j++; else if(S[i]==S[j]) { k=1; while(S[i+k]==S[j+k]&&k<lens) k++; if(S[i+k]>S[j+k]) i=j,j=i+1; else if(S[i+k]<S[j+k]) j++; else j++; } } return i; }