求最小Hamming距离的DNA序列

提示:两个等长字符串的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;

}


猜你喜欢

转载自blog.csdn.net/qq742762377/article/details/80558145