之前没有发现这是一本C语言编写得书,但本人还未学习过C语言,只能尝试用java实现书中的代码,在此记录学习这本书的历程。
本人新手菜鸟,能力有限,如果有误或者有改进的地方欢迎指出,谢谢\(▔▽▔)/。
题目:长度为n的环状串有n种表示方法,分别从某个位置开始顺时针得到。例如图中的环状串有10种表示:CGAGTCAGCT,GAGTCAGCTC,AGTCAGCTCG等。这些表示法中,字典顺序最小的称为“最小表示”。
输入一个长度为n(n<=100)的环状DNA串(只包含A,G,C,T这四种字符)的一种表示法。输出该环状字符串的最小表示。例如CTCC的最小表示为CCCT,CGAGTCAGCT的最小表示为AGCTCGAGTC.
//这里给出的是输入一个字符串及其长度(先输入长度)的情况,原书中的先输入字符串的个数,在分别输入各个字符串
//如有多个字符串可以在最外层再加一个while循环
public static void main(String args[]) {
Scanner input = new Scanner(System.in);
int length = input.nextInt();//接受环状字符串的长度
input.nextLine();
char []lines = new char[length];
String line = input.nextLine();
for(int i = 0;i < length;i++) { //储存环状字符串
lines[i] = line.charAt(i);
}
int smalist = 0; //保存最小起始点
for(int b = 1;b < length ;b++) { //寻找最小起始点
smalist = less(lines,smalist,b);
}
for(int k = 0;k < length;k++) { //输出最小顺序的字符串
System.out.print(lines[(smalist + k)%length]);
}
}
public static int less(char[] lines,int now,int news) {
for(int i = 0;i < lines.length;i++) {
//!= 保证了前i个字符是相等的
if(lines[(now + i)%lines.length] != lines[(news + i)%lines.length] ) {
//从now,news开始往后知道now-1和news-1
if(lines[(now + i)%lines.length] > lines[(news + i)%lines.length] ) {
return news;
}
//注意判断字典顺序时先判断当前字符的大小,相同时才考虑长度,所以这里要及时返回
return now; //当lines[(now + i)%lines.length] < lines[(news + i)%lines.length]时
}
}
return now; //相等时返回
}