题目描述:

一个DNA序列由A/C/G/T四个字母的排列组合组成。G和C的比例(定义为GC-Ratio)是序列中G和C两个字母的总的出现次数除以总的字母数目(也就是序列长度)。在基因工程中,这个比例非常重要。因为高的GC-Ratio可能是基因的起始点。
给定一个很长的DNA序列,以及要求的最小子序列长度,研究人员经常会需要在其中找出GC-Ratio最高的子序列。
输入
  输入一个string型基因序列,和int型子串的长度
输出
  找出GC比例最高的字串
样例输入
  AACTGTGCACGACCTGA 5
样例输出
   GCACG

思路:

最常见和最易想到的方法是直接截取一个长度不小于minLen的子串,然后判断其中的GC-Ratio;确定这个子串是否是GC-Ratio最大的,但是此方法复杂度太高,每次截取子串后又要对子串进行遍历统计。

所以,我提出了下面的方法,对于一个确定的起点,对最长的子串进行一次遍历就可以确定以此为起点的相应的最高的GC-Ratio的子串,这样复杂度有所降低

 import java.util.Scanner;

 /**
* 一个DNA序列由A/C/G/T四个字母的排列组合组成。G和C的比例(定义为GC-Ratio)是
* 序列中G和C两个字母的总的出现次数除以总的字母数目(也就是序列长度)。在基因工程
* 中,这个比例非常重要。因为高的GC-Ratio可能是基因的起始点。
* 给定一个很长的DNA序列,以及要求的最小子序列长度,研究人员经常会需要在其中找
* 出GC-Ratio最高的子序列
*
* 输入
* 输入一个string型基因序列,和int型子串的长度
* 输出
* 找出GC比例最高的字串
* 样例输入 AACTGTGCACGACCTGA 5
* 样例输出 GCACG
*
*/
public class DNASeq { public static void main(String[] args) {
// 输入读取参数
Scanner cin = new Scanner(System.in);
String seq = cin.next();
int minLen = cin.nextInt() ;
cin.close(); System.out.println(findOpticalSubseq(seq,minLen)); } /**
* 输入字符串和最小子串长度,返回GC-Ratio最高的子串
* @param seq
* @param minLen
* @return
*/
private static String findOpticalSubseq(String seq, int minLen) {
String res ;
//记录GC-Ratio最高的子串在字符串seq中的起点和终点
int [] index = new int[2] ;
float maxRatio = 0.0f ;
int count ; /*
* 最常见和最易想到的方法是直接截取一个长度不小于minLen的子串,然后判断其中的GC-Ratio;
* 确定这个子串是否是GC-Ratio最大的,但是此方法复杂度太高,每次截取子串后又要对子串进行遍历统计
* 所以,我提出了下面的方法,对于一个确定的起点,一次对最长的子串进行一次遍历就可以确定相应的
* 最高的GC-Ratio的子串的起点和终点,复杂度有所降低
*/
for(int i = 0 ; i < (seq.length() - minLen) ; i++){
count = 0 ;
for(int j = i ; j < seq.length() ; j++){
if(seq.charAt(j) == 'G' || seq.charAt(j) == 'C'){
count++ ;
}
//满足子串长度要求以及GC-Ratio更高的时候更新GC-Ratio和起点和终点的值
if((j-i+1) >= minLen && count/(j-i+1.0f) > maxRatio){
maxRatio = count/(j-i+1.0f) ;
index[0] = i ;
index[1] = j ;
}
}
} //根据起点和终点的位置确定返回的子串
if(index[1] == (seq.length()-1)){
res = seq.substring(index[0]) ;
}else{
res = seq.substring(index[0], index[1]+1) ;
} return res ;
} }

Code

华为OJ平台——DNA序列的更多相关文章

  1. 华为OJ平台——字符串分隔

    题目描述: 连续输入字符串,请按长度为8拆分每个字符创 后输出到新的字符串数组: 长度不是8整数倍的字符串请在后面补数字0,空字符串不处理 输入 连续输入字符串(输入两次,每个字符长长度小于100)输 ...

  2. 华为OJ平台——输出最小的k个数

    输入n个整数,输出其中最小的k个. 详细描述: 接口说明 原型: bool GetMinK(unsignedint uiInputNum, int *pInputArray, unsignedint ...

  3. 华为OJ平台——矩阵乘法

    题目描述: 如果A是个x行y列的矩阵,B是个y行z列的矩阵,把A和B相乘,其结果将是另一个x行z列的矩阵C. 输入: 1.第一个矩阵的行数 2.第一个矩阵的列数(也是第二个矩阵的行数) 3.第二个矩阵 ...

  4. 华为OJ平台——密码强度等级

    题目描述: 密码按如下规则进行计分,并根据不同的得分为密码进行安全等级划分. 一.密码长度: 5 分: 小于等于4 个字符 10 分: 5 到7 字符 25 分: 大于等于8 个字符 二.字母: 0  ...

  5. 华为OJ平台——求最大连续bit数

    题目描述: 求一个byte数字对应的二进制数字中1的最大连续数,例如3的二进制为00000011,最大连续2个1 输入: 一个byte型的数字    输出: 对应的二进制数字中1的最大连续数 思路: ...

  6. 华为OJ平台——统计字符串中的大写字母

    题目描述: 统计字符串中的大写字母的个数 输入: 一行字符串 输出: 字符串中大写字母的个数(当空串时输出0) 思路: 这一题很简单,直接判断字符串中的每一个字符即可,唯一要注意的一点是输入的字符串可 ...

  7. 华为OJ平台——将真分数分解为埃及分数

    题目描述: 分子为1的分数称为埃及分数.现输入一个真分数(分子比分母小的分数,叫做真分数),请将该分数分解为埃及分数.如:8/11 = 1/2+1/5+1/55+1/110. 输入: 输入一个真分数, ...

  8. 华为OJ平台——字符串匹配

    题目描述: 判断短字符串中的所有字符是否在长字符串中全部出现 输入: 输入两个字符串. 第一个为短字符,第二个为长字符 输出: true  - 表示短字符串中所有字符均在长字符串中出现 false - ...

  9. 华为OJ平台——整形数组合并

    题目描述: 将两个整型数组按照升序合并,并且过滤掉重复数组元素 输入: 输入说明,按下列顺序输入: 1 输入第一个数组的个数 2 输入第一个数组的数值 3 输入第二个数组的个数 4 输入第二个数组的数 ...

随机推荐

  1. ubuntu ipv6网络电视(avplay)

    首先在ubuntu下安装好ipv6 (话说是已经装好了的,不过最好检查以下) 网上有很多资源,我不写了. 测试一下 :ping ipv6.scau.edu.cn 另外,关于ipv6 网络播放器很多人推 ...

  2. 使用 HTML5 Shiv 让 IE 支持 HTML5

    HTML5 Shiv 使用 html5.js 必须在页面head元素内调用(因为 IE 必须在元素解析前知道这个元素,所以这个 JS 文件不能在页面底部调用.) 作者已经把js文件放在Google c ...

  3. VisualStudio 调试不提示调试错误

    尝试办法: 1.工具->选项->调试->启用异常助手;2.调试->异常; 解决办法: 把2.调试->异常; 下地全部钩上异常就弹出来了

  4. codeforces 55D - Beautiful numbers(数位DP+离散化)

    D. Beautiful numbers time limit per test 4 seconds memory limit per test 256 megabytes input standar ...

  5. 在ScrollView中嵌入GridView

    做android程序开发的都知道,不能在一个拥有Scrollbar的组件中嵌入另一个拥有Scrollbar的组件,因为这不科学,会混淆滑动事件,导致只显示一到两行数据.那么就换一种思路,首先让子控件的 ...

  6. Apache2 添加登陆用户名和密码

    1. 修改httpd.conf, 对要做认证的目录进行设置<Directory "/usr/local/var/www">   Options Indexes Foll ...

  7. linux下批量修改文件名之rename

    最近因为突然用到需匹配更换文件名,发现rename命令真是 简单好用,和sed语法及vim 替换很相似. 1. 更改文件名后缀 rename 's/\.txt/\.html/' * 2.增加文件名后缀 ...

  8. Vim 中截取部分内容保存到其他文件

    最近无聊,突然想跟着玩玩天池数据挖掘,发现数据好大,想转换到mysql数据库,phpmyadmin import 导入时抱错! 数据文件大大! 于是乎,准备截取一小段到另外一个文件测试先,然后,发现了 ...

  9. android studio 安装报错 unable to run mksdcard sdk tool

    搜了一下原来缺少这个 sudo apt-get install lib32z1 lib32ncurses5  lib32stdc++6

  10. 20145305 《Java程序设计》第8周学习总结

    教材学习内容总结 1.NIO使用频道来衔接数据节点,可以设定缓冲区容量,在缓冲区中对感兴趣的数据区块进行标记,提供clear().rewind().flip().compact()等高级操作 2.想要 ...