HJ63. DNA序列
描述
一个 DNA 序列由 A/C/G/T 四个字母的排列组合组成。 G 和 C 的比例(定义为 GC-Ratio )是序列中 G 和 C 两个字母的总的出现次数除以总的字母数目(也就是序列长度)。在基因工程中,这个比例非常重要。因为高的 GC-Ratio 可能是基因的起始点。
输入描述
输入一个string型基因序列,和int型子串的长度
输出描述
找出GC比例最高的子串,如果有多个则输出第一个的子串
示例1
输入:
ACGT 2
输出:
CG
说明:
ACGT长度为2的子串有AC,CG,GT3个,其中AC和GT2个的GC-Ratio都为0.5,CG为1,故输出CG示例2
输入:
AACTGTGCACGACCTGA 5
输出:
GCACG
说明:
虽然CGACC的GC-Ratio也是最高,但它是从左往右找到的GC-Ratio最高的第2个子串,所以只能输出GCACG。C 解法, 执行用时: 1ms, 内存消耗: 280KB, 提交时间: 2021-06-05
#include <stdio.h> #include <string.h> int main(void) { char s[888]; int i, j, len, k, sum, idx, max; while(scanf("%s%d", s, &k) != EOF) { len = strlen(s); i = idx = 0; sum = s[0]=='G' || s[0]=='C'; for(j=1; j<k; j++) if(s[j]=='G' || s[j]=='C') sum++; max = sum; for( ; j<len; i++,j++){ if(s[j]=='G' || s[j]=='C'){ if(s[i]=='G' || s[i]=='C') continue; if(++sum > max){ max = sum; idx = i+1; } continue; } if(s[i]=='G' || s[i]=='C') sum--; } s[ idx+k ] = '\0'; printf("%s\n", s+idx); } return 0; }
C 解法, 执行用时: 2ms, 内存消耗: 284KB, 提交时间: 2021-08-12
#include <stdio.h> int main() { char DNA[1000]={0}; int n; while(scanf("%s%d",&DNA,&n)!=EOF) { int i,j,CG[1000]={0}; int L=strlen(DNA); for(i=0;i<=L-n;i++) { for(j=i;j<=i+n-1;j++) { if(DNA[j]=='C'||DNA[j]=='G') { CG[i]+=1; } } } int a[1000]={0}; for(i=0;i<=L-n;i++) { a[i]=CG[i]; } for(i=1;i<=L-n;i++) { if(a[0]<a[i]) { int tmp=a[0]; a[0]=a[i]; a[i]=tmp; } } for(i=0;i<=L-n;i++) { if(CG[i]==a[0]) break; } for(j=i;j<=i+n-1;j++) { printf("%c",DNA[j]); } } return 0; }