题意翻译
长度为nn 的环状串有nn 种表示法,分别为从某个位置开始顺时针得到的。在环状串的所有表示法中,字典序最小的称为“最小表示”。
输入一个长度为nn 的环状DNA串(只包含AA ,CC ,GG ,TT 这四种字符)的一种表示法,你的任务是输出该环状串的最小表示。
输入输出样例
**Sample Input **
2
CGAGTCAGCT
CTCC
Sample Output
AGCTCGAGTC
CCCT
思路
前提理解:
字典序:字典序,即字符串在字典中的顺序.对于两个字符串,从第一个字符开始,从第一个字符开始比较,当某一个位置的字符不同时,该位置字符比较小的串,字典序较小.如果比较中,一个字符串已经走完,则这个字符串字典序较小.
思路:
用每一位作为第一位,来逐个判断
代码
#include <stdio.h>
#include <string.h>
char str[115];
char min[115];
int main() {
int count;
// 记录循环起始位
int flag = 0;
scanf("%d", &count);
while (count--) {
scanf("%s", str);
// 初始化为第一位
flag = 0;
int len = strlen(str);
for (int i = 1; i < len; i++) {
for (int j = 0; j < len; j++) {
/*
(j + flag) % len 这个技巧在循环队列中也用到了,j可以理解为第几位,
flag就是以原字符串的第flag位为第一位
*/
if (str[(j + flag) % len] != str[(j + i) % len]) {
// 判断字典序,注意 else语句不能丢
if (str[(j + flag) % len] > str[(j + i) % len]) {
flag = i;
break;
} else {
break;
}
}
}
}
// 打印答案
for (int k = 0; k < len; k++) {
printf("%c", str[(k + flag) % len]);
}
// 注意换行
printf("\n");
}
return 0;
}
总结
- 循环队列的表示技巧,(j+flag)%len.
- 使用if语句时,需要注意else语句的内容,不能忽视else语句
- 输出中如果有字符,最好从样例中复制,尽量不要自己打.