长度为 n 的环状串有 n 种表示法,分别为从某个位置开始顺时针得到。
例如,图3-4的环状串有10种表示:CGAGTCAGCT,GAGTCAGCTC,AGTCAGCTCG 等。
在这些表示法中,字典序最小的称为“最小表示”
输入一个长度为n (n100)的环状DNA串(只包含A、C、GT这 4 种字符)的一种表示法,
你的任务是输出该环状串的最小表示。
CTCC 的最小表示是 CCCT,CGAGTCAGCT的最小表示为AGCTCGAGTC。
#include <stdio.h>
#include <string.h>
#define MAX 105
int less(const char* s, int p, int q) { //比较p,q环的字典序
int len = strlen(s);
for (int i = 0; i < len; i++) {
if (s[(p + i) % len] != s[(q + i) % len]) return s[(p + i) % len] > s[(q + i) % len];
return 0;//相等
}
}
int main()
{
int T;
scanf("%d",&T);
char s[MAX];
while (T--) {
scanf("%s", s);
int ans = 0;
int len = strlen(s);
for (int i = 0; i < len; i++) {
if (less(s, ans, i)) ans = i;//a如果从i开始的环字典序小于ans,则i为最小环
}
for (int i = 0; i < len; i++) {
putchar(s[(i + ans) % len]); //从ans开始输入整个环
}
putchar('\n');
}
return 0;
}