《算法竞赛入门(第二版)》--java实现.3.2字符数组.DNA序列

        之前没有发现这是一本C语言编写得书,但本人还未学习过C语言,只能尝试用java实现书中的代码,在此记录学习这本书的历程。

       本人新手菜鸟,能力有限,如果有误或者有改进的地方欢迎指出,谢谢\(▔▽▔)/。

题目:输入m个长度均为n的DNA序列,求一个DNA序列,到所有序列的总Hamming距离尽量小。两个等长字符串的Hamming距离等于字符不同位置的个数,例如,ACGT和GCGA的Hammin距离为2(左数第1,4个字符不同),。

       输入整数m和n(4<=m<=50,4<=n<=1000),以及m个长度为n的DNA序列(只包含字母A,C,T,G),输出到m个序列的Hamming距离和最小的DNA序列和对应的距离。如有多解,要求为字典顺序最小的解。例如对于下面5个DNA序列,最优解为TAAGATAC.

输入:TATGATAC,TAAGCTAC,AAAGATCC,TGAGATAC,TAAGATGT.

//省清题意,是找到一个字典顺序最小且到每个输入字符串的Hamming距离和也最小的字符串    
public static void main(String args[]) {
    	Scanner input = new Scanner(System.in);
    	int number1 = input.nextInt();
    	int number2 = input.nextInt();
    	char [][]dna = new char[number1][number2];
    	int count = 0;
    	input.nextLine();
    	while(count < number1) {
    		String line = input.nextLine();
    	    for(int i = 0;i < line.length();i++) {
    	    	dna[count][i] = line.charAt(i);
    	    }
    	    count++;
    	}
    	findMinString(dna);
    }
    
    public static void findMinString(char[][]dna) {
    	char []token = {'A','C','G','T'};
    	String smin = "";
    	int number = 0;
    	for(int i = 0;i < dna[0].length;i++) {
    		char m = ' ';
    		int []count = new int [4];
    		for(int n = 0;n < dna.length;n++) { 
    			for(int k = 0;k < token.length;k++) {
    				if(token[k] != dna[n][i]) {
    					count[k] ++;
    				}
    			}
    		}
    		int a = 0;
    		int min = count[0];
    		m = token[0];
    		for(int g = 1;g < count.length;g++) {
    			if(count[g] < min) {
    				a = g;
    				m = token[g];
    				min = count[g];
    			}else if(count[g] == min) {
    				if(token[g] < m) {
    					a = g;
        				m = token[g];
        				min = count[g];
    				}
    			}
    		}
    		smin += m;
    		number += min;
    	}
    	System.out.print(smin +" "+ number);
    }
    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值