DNA序列——来自华为OJ平台测试的基础题



/*
 * 一个DNA序列由A/C/G/T四个字母的排列组合组成。G和C的比例(定义为GC-Ratio)是序列中G和C两个字母的总的出现次数除以总的字母数目(也就是序列长度)。
 * 在基因工程中,这个比例非常重要。因为高的GC-Ratio可能是基因的起始点。
 * 给定一个很长的DNA序列,以及要求的最小子序列长度,研究人员经常会需要在其中找出GC-Ratio最高的子序列。
 * 知识点:  字符串
 * 题目来源:  内部整理
 * 练习阶段:  初级
 * 运行时间限制: 10Sec
 * 内存限制: 128MByte
 * 输入: 
 * 输入一个string型基因序列,和int型子串的长度
 * 输出: 
 * 找出GC比例最高的字串
 * 样例输入: 
 * AACTGTGCACGACCTGA
 * 5              
 * 样例输出: 
 * GCACG           
*/
#include <string>
#include <string.h>
#include <iostream>

using namespace std;

int main()
{
 std::string DNASequence;
 std::string NumberStr;
 
 
 int CharNum = 0;
 int MaxGCNum = 0;
 // 输入DNA序列
 getline(std::cin,DNASequence,'\n');

 int DNAlength = static_cast<signed>(DNASequence.size());

 if(DNAlength==0)
 {
  system("pause");
  return -1;
 }

 getline(std::cin,NumberStr,'\n');

 int Numlength = static_cast<signed>(NumberStr.size());

 if((Numlength > sizeof(int))||(Numlength == 0))
 {
  system("pause");
  return -1;
 }

 const int MinDNAlength = atoi(NumberStr.c_str());

 if((MinDNAlength<=0)|| (MinDNAlength>DNAlength))
 {
  system("pause");
  return -1;
 }

 if(DNAlength<MinDNAlength)
 {
  system("pause");
  return -1;
 }

 char* MaxGCDNA = new char[MinDNAlength+1];
 char* GCDNATemp = new char[MinDNAlength+1];
 int BeginNum = CharNum;
 
 int i=0;
 int Tempsize=0;
 while(CharNum<DNAlength)
 { 
  int MaxGCNumtemp = 0;
  Tempsize=0;
  
  for(i=BeginNum;i<BeginNum+MinDNAlength;i++)
  {
   if(i>=CharNum)
    CharNum++;

   char a = DNASequence.at(i);

   if((a=='G') || (a=='C'))
   {
    GCDNATemp[Tempsize] = a;
    MaxGCNumtemp++;
    Tempsize++;
   }
//   else if((a!='T') && (a!='A'))
//   {
//    system("pause");
//    return -1;
//   }
   else
   {
    GCDNATemp[Tempsize] = a;
    Tempsize++;
   }
  }
  GCDNATemp[Tempsize] = '\0';
  if(BeginNum==0)
  {
   strcpy_s(MaxGCDNA,MinDNAlength+1,GCDNATemp);
   MaxGCNum = MaxGCNumtemp;
  }
  if(MaxGCNumtemp>MaxGCNum)
  {
   strcpy_s(MaxGCDNA,MinDNAlength+1,GCDNATemp);
   MaxGCNum = MaxGCNumtemp;
  }
  BeginNum = (CharNum - MinDNAlength) + 1;

 } 

 for(int j=0;j<MinDNAlength;j++)
  std::cout<< MaxGCDNA[j];
 std::cout << endl;

 delete[] MaxGCDNA;
 delete[] GCDNATemp;

 system("pause");
 return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值