UVA1368 DNA Consensus String

**题意:**DNA(Deoxyribonucleic Acid)是包含遗传信息的分子.它由四种不同的核苷酸组成,分别为A,T,G,C. 如图一所示,如果我们把核苷酸表示其相应的字母,一个DNA序列可以被表示为一个由四种字符(ATGC)组成的长串. 例如,加入我们得到了一部分DNA序列,该序列组成如下:

Thymine-Adenine-Adenine-Cytosine-Thymine-Guanine-CytosineCytosine-Guanine-Adenine-Thymine

那么我们可以用字符串

TAACTGCCGAT

表示它.

生物学家Ahn发现,基因X一般存在于五个不同种类的生物的DNA序列中,即猫(>^ω^<)喵,苟-1s,马,牛和猴子. 他还发现各种动物的基因X都很相似.如图二.

Ahn教授认为,人力可能也有基因X.他决定寻找人类DNA中的X.然而,在查找之前,它应该定义一个具有代表性的X基因序列. Hamming距离是指两个长度相等的字符串中每个位置不同字符的数目. 例如,AGCAT和GGAAT的Hamming距离为2,因为这两个字符串的第零,第二个字符不同. 使用Hamming距离,我们可以定义最具代表性的字符串来代表一组多个等长字符串. 给一组长度为n的字符串S={s1,s2…sm},Y是所有可能的字符串中,与S中各串Hamming距离和最小的字符串.Y被称为代表串

例如,给出三个字符串”AGCAT”“AGACT”和”GGAAT”,它们的代表串是AGAAT.因为AGAAT和三个给定字符串的Hamming总和最小. (在这种情况下,代表串是唯一的.但是通常可能有多个代表串)

我们用代表串作为DNA序列的代表,对于图2的例子,一个代表串是GCAAATGGCTGTGC,总Hamming和为7.

================================================================================================== 输入 你的程序应当从标准输入中读取数据.测试数据有T组,T在第一行给出. 从T+1行开始,每组数据的开始包含两个由单空格分隔的整数m和n,接下来m行每行给出一个长度为n的DNA序列. 4≤M≤50,4≤n≤1000

================================================================================================== 输出 你的程序应当输出到标准输出.对于每组数据输出两行,第一行输出代表串(总Hamming和最小的串),第二行输出总Hamming距离和. 如果存在多个代表串,输出自电信最小的一个.
思路:按列来比较出出现频率最大的字母,然后用该字符数组的行数减去最多出现的字母的个数便得出该列的Hamming距离,循环处理即可。

import java.util.Scanner;
import java.lang.String;

public class Main {
    static Scanner sc = new Scanner(System.in);
    static char[] arrayc = { 'A', 'C', 'G', 'T' };

    public static void main(String[] args) {
        int number=sc.nextInt();
        while(number--!=0){
            max();
            System.out.println();
        }

    }

    public static void max() {
        int r = sc.nextInt();
        int c = sc.nextInt();
        int sum = 0;
        char[][] car = new char[r][c];
        for (int i = 0; i < r; i++) {
            String s1 = sc.next();
            for (int j = 0; j < c; j++) {
                car[i][j] = s1.charAt(j);
            }
        }
        for (int j = 0; j < c; j++) {
            int[] nub = new int[4];
            for (int i = 0; i < r; i++) {
                switch (car[i][j]) {
                case 'A':
                    nub[0]++;
                    break;
                case 'C':
                    nub[1]++;
                    break;
                case 'G':
                    nub[2]++;
                    break;
                case 'T':
                    nub[3]++;
                    break;
                }
            }
            int tem=0;
            for(int k=1;k<4;k++) {
                if(nub[tem]<nub[k])
                 tem=k;

            }
            System.out.print(arrayc[tem]);
            sum+=r-nub[tem];
        }
        System.out.println();
        System.out.print(sum);

    }
}

猜你喜欢

转载自blog.csdn.net/qq_42962737/article/details/81909947