题目信息
一个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版权协议,转载请附上原文出处链接和本声明。