您的位置:首页 > 其它

字符串最小表示法(1) 朴素算法

2014-10-07 15:08 288 查看
循环字符串的最小表示法的问题可以这样描述:

对于一个字符串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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: