之前没有发现这是一本C语言编写得书,但本人还未学习过C语言,只能尝试用java实现书中的代码,在此记录学习这本书的历程。
本人新手菜鸟,能力有限,如果有误或者有改进的地方欢迎指出,谢谢\(▔▽▔)/。
题目:输入m个长度均为n的DNA序列,求一个DNA序列,到所有序列的总Hamming距离尽量小。两个等长字符串的Hamming距离等于字符不同位置的个数,例如,ACGT和GCGA的Hammin距离为2(左数第1,4个字符不同),。
输入整数m和n(4<=m<=50,4<=n<=1000),以及m个长度为n的DNA序列(只包含字母A,C,T,G),输出到m个序列的Hamming距离和最小的DNA序列和对应的距离。如有多解,要求为字典顺序最小的解。例如对于下面5个DNA序列,最优解为TAAGATAC.
输入:TATGATAC,TAAGCTAC,AAAGATCC,TGAGATAC,TAAGATGT.
//省清题意,是找到一个字典顺序最小且到每个输入字符串的Hamming距离和也最小的字符串
public static void main(String args[]) {
Scanner input = new Scanner(System.in);
int number1 = input.nextInt();
int number2 = input.nextInt();
char [][]dna = new char[number1][number2];
int count = 0;
input.nextLine();
while(count < number1) {
String line = input.nextLine();
for(int i = 0;i < line.length();i++) {
dna[count][i] = line.charAt(i);
}
count++;
}
findMinString(dna);
}
public static void findMinString(char[][]dna) {
char []token = {'A','C','G','T'};
String smin = "";
int number = 0;
for(int i = 0;i < dna[0].length;i++) {
char m = ' ';
int []count = new int [4];
for(int n = 0;n < dna.length;n++) {
for(int k = 0;k < token.length;k++) {
if(token[k] != dna[n][i]) {
count[k] ++;
}
}
}
int a = 0;
int min = count[0];
m = token[0];
for(int g = 1;g < count.length;g++) {
if(count[g] < min) {
a = g;
m = token[g];
min = count[g];
}else if(count[g] == min) {
if(token[g] < m) {
a = g;
m = token[g];
min = count[g];
}
}
}
smin += m;
number += min;
}
System.out.print(smin +" "+ number);
}