字符串最小表示法(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;
}


原文地址:https://www.cnblogs.com/zy691357966/p/5480473.html