UVA 1584 环状序列

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());
	}
	
}

八、总结

最小字典序的序列,其首字母一定是串中所有字母的最小字母

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值