package 第三章习题;
/*
* 输入m个长度均为n的DNA序列,求一个DNA序列,到所有序列的总Hamming距离尽量小。
* 两个等长字符串的Hamming距离等于字符不同的位置个数,
* 例如,ACGT和GCGA的Hamming距离为2(左数第1, 4个字符不同)。
输入整数m和n(4≤m≤50, 4≤n≤1000),
以及m个长度为n的DNA序列(只包含字母A,C,G,T),
输出到m个序列的Hamming距离和最小的DNA序列和对应的距离。
如有多解,要求为字典序最小的解。
例如,对于下面5个DNA序列,最优解为TAAGATAC。
TATGATAC
TAAGCTAC
AAAGATCC
TGAGATAC
TAAGATGT
*/
import java.util.*;
public class DNA序列 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in=new Scanner(System.in);
int m=in.nextInt();
int n=in.nextInt();
String s[]=new String[m];
for(int i=0;i<m;i++) {
s[i]=in.next();
}
String str = "";
for(int i=0;i<n;i++)
{
int A=0,C=0,G=0,T=0;
for(int j=0;j<m;j++)
{
if(s[j].charAt(i)=='A')A++;
else if(s[j].charAt(i)=='C')C++;
else if(s[j].charAt(i)=='G')G++;
else if(s[j].charAt(i)=='T')T++;
}
str+=max(A,C,G,T);
}
System.out.println(str);
}
private static char max(int A, int C, int G, int T) {
// TODO Auto-generated method stub
int a[]=new int[4];
a[0]=A;
a[1]=C;
a[2]=G;
a[3]=T;
int max=a[0];
for(int i=1;i<4;i++) {
if(a[i]>max) {
max=a[i];
}
}
if(max==A) {
return 'A';
}
else if(max==C) {
return 'C';
}
else if(max==G) {
return 'G';
}
else if(max==T) {
return 'T';
}
return ' ';
}
}
/*
* 输入m个长度均为n的DNA序列,求一个DNA序列,到所有序列的总Hamming距离尽量小。
* 两个等长字符串的Hamming距离等于字符不同的位置个数,
* 例如,ACGT和GCGA的Hamming距离为2(左数第1, 4个字符不同)。
输入整数m和n(4≤m≤50, 4≤n≤1000),
以及m个长度为n的DNA序列(只包含字母A,C,G,T),
输出到m个序列的Hamming距离和最小的DNA序列和对应的距离。
如有多解,要求为字典序最小的解。
例如,对于下面5个DNA序列,最优解为TAAGATAC。
TATGATAC
TAAGCTAC
AAAGATCC
TGAGATAC
TAAGATGT
*/
import java.util.*;
public class DNA序列 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in=new Scanner(System.in);
int m=in.nextInt();
int n=in.nextInt();
String s[]=new String[m];
for(int i=0;i<m;i++) {
s[i]=in.next();
}
String str = "";
for(int i=0;i<n;i++)
{
int A=0,C=0,G=0,T=0;
for(int j=0;j<m;j++)
{
if(s[j].charAt(i)=='A')A++;
else if(s[j].charAt(i)=='C')C++;
else if(s[j].charAt(i)=='G')G++;
else if(s[j].charAt(i)=='T')T++;
}
str+=max(A,C,G,T);
}
System.out.println(str);
}
private static char max(int A, int C, int G, int T) {
// TODO Auto-generated method stub
int a[]=new int[4];
a[0]=A;
a[1]=C;
a[2]=G;
a[3]=T;
int max=a[0];
for(int i=1;i<4;i++) {
if(a[i]>max) {
max=a[i];
}
}
if(max==A) {
return 'A';
}
else if(max==C) {
return 'C';
}
else if(max==G) {
return 'G';
}
else if(max==T) {
return 'T';
}
return ' ';
}
}