牛客网|DNA序列

题目信息

一个DNA序列由A/C/G/T四个字母的排列组合组成。G和C的比例(定义为GC-Ratio)是序列中G和C两个字母的总的出现次数除以总的字母数目(也就是序列长度)。在基因工程中,这个比例非常重要。因为高的GC-Ratio可能是基因的起始点。

给定一个很长的DNA序列,以及要求的最小子序列长度,研究人员经常会需要在其中找出GC-Ratio最高的子序列。

本题含有多组样例输入。

输入描述

输入一个string型基因序列,和int型子串的长度

输出描述

找出GC比例最高的子串,如果有多个输出第一个的子串

示例输入

AACTGTGCACGACCTGA
5

示例输出

GCACG

题解

根据题目意思,可以得出

  • 统计当前位置的接下来N-1个字符中C/G的个数,算上当前位置,一共是N个字符
  • 对于输入字符串,可以转为字符数组来操作

编码

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class DnaSerial {

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String input;
		while ((input = br.readLine()) != null) {
			char[] chArr = input.toCharArray();
			// 须要统计的字符长度
			Integer length = Integer.parseInt(br.readLine());
			
			// 最大有效字符个数
			int count = 0;
			// 匹配的有效字符串
			String str = null;
			int i=0;
			do {
				// 当前位置有效字符个数
				int currentCount = 0;
				int index = 0;
				// 判断当前位置时,接下来length个字符中有效字符个数
				while (index < length) {
					if (chArr[i+index] == 'G' || chArr[i+index] == 'C') {
						currentCount++;
					}
					index++;
				}
				
				// 如果有效字符个数大于最大字符个数,替换
				if (currentCount > count) {
					count = currentCount;
					str = String.valueOf(input.substring(i, i+length));
				}
				i++;
			} while(i<chArr.length-length);
			
			System.out.println(str);
		}
	}
}

编码中,刚开始do~while部分使用的是for循环,结果发现,如果要求的字符串长度和原始字符串长度相同时,导致会直接跳出for循环,修改为do~while循环后,保证至少执行一次。


版权声明:本文为magi1201原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。