问题描述
长度为n的环状串有n种表示法,分别为某个位置开始顺时针得到。CGAGTCAGCT,GAGTCAGCTC,AGTCAGCTCG等。在这些表示法中,字典序最小的称为“最小表示”。输入一个长度为n(n<=100)的环状DNA串(只包含A、C、G、T这4种字符)的一种表示法,你的任务是输出该环状串的最小表示。例如:
CTCC的最小表示是CCCT
CGAGTCAGCT的最小表示为AGCTCGAGTC。
样例输入:
2
CGAGTCAGCT
CTCC
样例输出:
AGCTCGAGTC
CCCT
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int T=sc.nextInt();//测试的次数
while(T-->0) {
String s=sc.next();
int ans=0;//最小串在输入串中的起始位置
char[] arr=s.toCharArray();//输入串转为字符数组
for (int i = 1; i < arr.length; i++) {//直接从i=1开始(即第二个字母),因为ans初始值为0,不用比较
if(less(arr,i,ans)) {//如果i位置所对应字典序更小,则赋值给ans
ans=i;
}
}
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[(ans+i)%arr.length]);
}
System.out.println();
}
}
private static boolean less(char[] arr, int p, int q) {
for (int i = 0; i < arr.length; i++) {//从p,q的0号位置开始比较,当比较到不相等时,如果p对应的更小,则返回true
if(arr[(p+i)%arr.length]!=arr[(q+i)%arr.length])
return arr[(p+i)%arr.length]<arr[(q+i)%arr.length];
}
return false;
}
}