UVA 1584 环状序列
一、问题描述
长度为n的环状串有n种表示法,分别为从某个位置开始顺时针得到。
CGAGTCAGCT,GAGTCAGCTC,AGTCAGCTCG等。在这些表示法中,字典序最小的称为"最小表示"。
输入一个长度为n(n≤100)的环状DNA串(只包含A、C、G、T这4种字符)的一种表示法,你的任务是输出该环状串的最小表示。例如,CTCC的最小表示是CCCT,CGAGTCAGCT的最小表示为AGCTCGAGTC。
二、输入格式
三、输出格式
四、样例输入
五、样例输出
六、思路
七、代码
import java.util.*;
import java.io.*;
public class Main{
static PrintWriter pw;
public static void main(String[] args) throws IOException{
Reader read = new Reader();
pw = new PrintWriter(System.out);
int n = read.nextInt();
for(int i=0; i<n; i++) {
//接收环串
StringBuffer sb = new StringBuffer(read.next());
//确定环串中的最小字母: A<C<G<T
int c_min = (int)'T';
for(int j=0; j<sb.length(); j++) {
if(sb.charAt(j)<c_min) {
c_min = sb.charAt(j);
}
if(c_min=='A') {
break;
}
}
//并记录位置,将最小字符开头的串置入列表中
List<String> list = new LinkedList();
for(int j=0; j<sb.length(); j++) {
if(sb.charAt(j)==c_min) {
list.add(f(sb,j));
}
}
//比较出字典序最小的字符串
int res_index = 0;
for(int j=0; j<list.size(); j++) {
if(list.get(j).compareTo(list.get(res_index))<0) {
res_index = j;
}
}
pw.println(list.get(res_index));
}
pw.close();
}
static String f(StringBuffer sb,int index) {
StringBuffer res = new StringBuffer
(sb.substring(index,sb.length())+sb.substring(0,index));
return res.toString();
}
}
class Reader{
//从字符流中读取字符
static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
//字符串标记化器类
static StringTokenizer tokenizer = new StringTokenizer("");
//定义方法
static String next() throws IOException{
while(!tokenizer.hasMoreTokens()) {
String s = reader.readLine();
if(s==null) {
return null;
}
tokenizer = new StringTokenizer(s);
}
return tokenizer.nextToken();
}
static int nextInt() throws IOException{
return Integer.parseInt(next());
}
}
八、总结
最小字典序的序列,其首字母一定是串中所有字母的最小字母