/*
* 一个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;
}