题目大意:
给m个长度为n的DNA序列,求一个DNA序列到所有序列的总汉明距离最小,汉明距离为不同字符的位置的个数。如果有多个满足题意得序列则取字典序最小的那个。
Input
2
5 8
TATGATAC
TAAGCTAC
AAAGATCC
TGAGATAC
TAAGATGT
4 10
ACGTACGTAC
CCGTACGTAG
GCGTACGTAT
TCGTACGTAA
Output
TAAGATAC
7
ACGTACGTAA
6
实现:
#include<stdio.h>
#include<string.h>
#define maxn 1005
int main()
{
int t;
int m, n;
char buf[maxn][maxn];
int cnt;
char a[maxn];
int max[4];
int T, A, G, C;
int maxmum, index;
int k;
// freopen("C:\\Users\\zhangwei\\Desktop\\input.txt","r",stdin);
// freopen("C:\\Users\\zhangwei\\Desktop\\output.txt","w",stdout);
scanf("%d",&t);
while(t--){
cnt = 0;
scanf("%d%d",&m,&n);
for(int i = 0; i < m; i++ ){
scanf("%s",buf[i]);
}
for(int j = 0; j < n; j++ ){
memset(max, 0, sizeof(max));
for(int i = 0; i < m; i++ ){
if(buf[i][j] == 'A')
max[0]++;
if(buf[i][j] == 'C')
max[1]++;
if(buf[i][j] == 'G')
max[2]++;
if(buf[i][j] == 'T')
max[3]++;
maxmum = max[0];
index = 0;
for(k = 1; k < 4; k++){
if(max[k] > maxmum){
index = k;
maxmum = max[k];
}
}
}
cnt += m-maxmum;//这里 可以直接算出 Hamming数量了
char c;
if(index == 0) c = 'A';
if(index == 1) c = 'C';
if(index == 2) c = 'G';
if(index == 3) c = 'T';
a[j] = c;
}
a[n] = '\0';// 可以自己设定 '\0' (也可以按照字符数组来输出) 如果按照 %s 末尾必须 加\0
printf("%s\n%d\n",a, cnt);
// 这是开始相当计算 Hamming值的方法 需要扫描 效率比较低
// for(int i = 0; i < m; i++ ){
// for(int j = 0; j < n; j++ ){
// if(buf[i][j] != a[j])
// cnt++;
// }
// }
// printf("%d\n",cnt);
}
return 0;
}
题目 要求 Hamming最小 (并且按照字典序) 利用 数组 int a[] 分别按顺序记录 A C G T 数量 求出的自然是字典序
关于字符数组与字符串:
首先由字符数组的特点:不以字符'\0'为结束标志。
由字符串数组特点:以字符'\0'为结束标志。
其次,用printf函数以参数"%s"输出字符串时过程为:
- 从首地址开始逐字节寻址,把存储单元(一个字节)内的数据转换为相应数据应具有的的形式(如把二进制数转换为字符‘a’)
- 直到某一个字节内存的元素为字符'\0'时,输出此字符并且寻址结束。