一、什么是循环字符串的最小表示法
对于一个字符串S,求S的循环的同构字符串S’中字典序最小的一个。
如:S=bacd,则S’可以是acdb,cdba,dbac,其中最小表示的S’是acdb。即该字符串的循环同构字符串中字典序最小的一个是acdb
二、如何求解一个字符串的循环同构的最小表示
求解这个问题,实质上是在S串中寻找一个位置,从该位置起循环输出S,此时得到的S’字典序是最小的
思路一:
首先我们比较容易想得到的一个思路就是:设置i和j两个指针,i指向最小表示的位置,j指向比较指针。
令
可以看出以上方式在遇到类似bbbbbbba这样的字符串时,i指针每次移动一位,时间复杂度较高。
思路二、
同样令
对于当s[i+k]<s[j+k]时,此时说明j不是最小表示,移动j,j=j+k+1;
因为当s[i+k]<s[j+k],即第i+k个位置的字母序小于第j+k位置的字母序,因为此时从j位置开始(不包括j)到j+k位置的任何一个以这之间位置开头的字符串都将大于i位置开头的字符串。
三、代码实现
字符串的最小表示法
//字符串的最小表示法
字符串的最大表示法
//字符串的最大表示法