长度为n的环状串有n中表示方法,分别为从某个位置开始顺时针得到。例如3_4的环状串有10种表示:CGAGTCAGCT,GAGTCAGCTC,AGTCAGCTCG等。在这些表示法中,字典序最小的称为”最小表示“。输入一个长度为n(n<=100)的环状DNA串(只包含A,C,G,T这个4种字符),你的任务是输出该环状串的最小表示。例如CTCC的最小表示是CCCT,CGAGTCAGCT的最小表示为AGCTCGAGTC.
//解题三部1.读入环状串2.表示该串的不同表示 3.求解最小表示
#include <stdio.h>
#include <string.h>
#define maxn 105
int main()
{
int i=0,len=0;
char n[maxn],temp[maxn],min[maxn];
scanf("%s",n);
len=strlen(n);
for(int i=0;i<len;i++)//给最小表示数组赋初值
{
min[i]=n[i];
}
for(int i=0;i<len;i++) //将环状序列的各类表示分解出来
{
int j=0;
for(int k=0;k<len;k++)
{
if(k+i<len)
{
temp[k]=n[k+i];
}
else
{
temp[k]=n[j];
j++;
}
printf("%c ",temp[k]);
}
int flag=0;//找出当前的最小表示
for(int l=0;l<len;l++)
{
if(min[l]==temp[l])
continue;
else
{
if((int)min[l]>(int)temp[l])
{
flag=1;
break;}
else
{
break;
}
}
}
if(flag)//判断当前temp是否是最小表示
{
strcpy(min,temp);
}
printf("\n");
}
for(int l=0;l<len;l++)
{
printf("%c ",min[l]);
}
}