提示:两个等长字符串的Hamming距离,等于两个字符串相同的位置中,字符不同的个数。(如ACGT和GCGA的Hamming距离为2)
问题:
TATGATAC
TAAGCTAC
AAAGATCC
TGAGATAC
TAAGATGT
求一个 与上面所有DNA序列 Hamming距离最小 的DNA序列
解:TAAGATAC
思路:找到每一列中出现最多的字符,并把一个字符记录下来,当每一列出现最多的字符都记录下来后,这个记录就是答案。
方法1(小白):
#include<iostream>
using namespace std;
#define max 256
int n, m;
char DNA[10][10];
char maxchar(int index) { //找到 列 中出现最多的字符
int i,tmp=0, maxs;
int W[max] = { 0 };
char t;
for (i = 0; i < m; i++) { // 统计列中各个字符的数量
t = DNA[i][index];
W[t]++;
}
if (tmp < W['T']) {
tmp = W['T'];
maxs = 'T';
}
if (tmp < W['C']) {
tmp = W['C'];
maxs = 'C';
}
if (tmp < W['A']) {
tmp = W['A'];
maxs = 'A';
}
if (tmp < W['G']) {
tmp = W['G'];
maxs = 'G';
}
return maxs; //返回出现最多次的字符
}
int main() {
cin >> n >> m;
int i, j;
char str[10];
for (i = 0; i < m; i++)
for (j = 0; j < n; j++)
cin >> DNA[i][j];
for (i = 0; i < n; i++) {
cout << maxchar(i);
}
return 0;
}
方法2(大神版):
#include<iostream>
#include<string>
using namespace std;
#include<algorithm>
#include<assert.h>
#include<vector>
struct ChCnt {
int cnt;//与c相同的字符的个数
char c;
void init(char ch = 'A') {
c = ch;
cnt = 0;
}
ChCnt() {init();}
bool operator<(const ChCnt& cc2) const { // sort排序用到的函数
return cnt > cc2.cnt || (cnt == cc2.cnt && c < cc2.c);
}
};
int main() {
int T = 1;
int n, m;
cin >> T;
string line;
vector<string> seqs;
char IDX[256] = { 0 }; // 定好 字符 对应的 数组索引,方便找到 字符 对应的 结构体
IDX['A'] = 0;
IDX['C'] = 1;
IDX['G'] = 2;
IDX['T'] = 3;
while (T--) {
seqs.clear();
cin >> m >> n;
for (int i = 0; i < m; i++) {
cin >> line;
assert(line.size() == n); // 判断属否输入 n 个字符
seqs.push_back(line);// 加入到 seqs 容器
}
string ansStr;
int ans = 0;
vector<ChCnt> ccs(4); // 定义4个ChCnt结构体,分别存放 A C G T
for (int i = 0; i < n; i++) {
// 每一列的开始都要对 结构体数组 进行初始化
ccs[0].init('A');
ccs[1].init('C');
ccs[2].init('G');
ccs[3].init('T');
for (int j = 0; j < m; j++)
ccs[IDX[seqs[j][i]]].cnt++; // IDX在这里的作用是,能在结构体数组中 找到 字符 对应的 结构体
sort(ccs.begin(), ccs.end());
ansStr += ccs.front().c;
ans += (m - ccs.front().cnt); // 加上每列的 Hamming距离
}
cout << ansStr << endl << ans << endl;
}
return 0;
}