长度为n的环状串有n种表示法,分别为从某 个位置开始顺时针得到。在这些表示法中,字典序最小的称 为"最小表示"。 输入一个长度为n(n≤100)的环状DNA串(只包含A、C、G、T这4种字符)的一种表 示法,你的任务是输出该环状串的最小表示。例如,CTCC的最小表示是 CCCT,CGAGTCAGCT的最小表示为AGCTCGAGTC。
#include<stdio.h>
#include<string.h>
int less(char* s,int n,int m){
for(int i=0;i<strlen(s);i++){
if(s[(i+n)%strlen(s)]!=s[(i+m)%strlen(s)])
return (s[(i+n)%strlen(s)] < s[(i+m)%strlen(s)]);
}
return 0;
}
int main(){
char s[105];
int T;
scanf("%d",&T);
while(T--){
scanf("%s",s);
int len=strlen(s);
int ans=0;
for(int i=0;i<len;i++){
if(less(s,i,ans)) ans=i;
}
for(int i=0;i<len;i++){
printf("%c",s[(ans+i)%len]);
}
printf("\n");
}
return 0;
}
环形串的问题:设字符串的长度为len,那么环形串由某位置旋转len长度后,依然回到该位置。即可以理解为周期为len。关键表达式:s[(i+n)%len] ,表示字符串s中与下标i距离为n的下标对应的数据值(链状串中该表达式即为 s[i+n] )