思路

  1. 根据题意暴力破解
  2. 构造结构体存储子串对应的GC-Ratio、GC个数、出现的序号、子串注意:这里的结构体不是一次性想出来的,再程序调试过程中需要啥补啥
  3. 获取字符串和子串长度
  4. 查找子串,并将子串存储,子串是,从第0个向后数0+num
  5. 同时记录子串出现的次序,方便后续出现相同GC-Ratio时比较输出的顺序
  6. 统计每个子串的GC个数
  7. 计算GC-Ratio
  8. 将GC-Ratio从小到大排序
  9. 比较最大值和所有的值是否最大,如果有和最大值一样的值,输出最先出现的那个(次序最小那个)
  10. 必须得调试,一步一步走,不给调试本宝宝是做不出来 555555555555~

Answer

// 一个 DNA 序列由
// A/C/G/T 四个字母的排列组合组成。
// G 和 C 的比例(定义为 GC-Ratio )是序列中 G 和 C 两个字母的总的出现次数除以总的字母长度)。
// 给定一个很长的 DNA 序列,以及限定的子串长度 N ,
// 请帮助研究人员在给出的 DNA 序列中从左往右找出 GC-Ratio 最高且长度为 N 的第一个子串。
// DNA序列为 ACGT 的子串有: ACG , CG , CGT 等等,但是没有 AGT , CT 等等

#include<stdio.h>
#include<string.h>

struct {
    float Ratio;//子串对应的GC-Ratio
    int gc_cnt;//GC个数
    int sn;//出现的序号
    char str_child[1000];//子串
} data[1000], temp;

int main() {
    char str[1000];
    int num;
    scanf("%s", str);
    scanf("%d", &num);
    int len = strlen(str);
    int h = 0;
    int k = 0;
    for (int i = 0; i < len - num + 1; i++) {
        k = 0;
        //子串是,从第1个向后数1个,从第2个向后数1个,从第3个向后数1个

        for (int j = i; j < i + num; j++) {
            data[h].str_child[k++] = str[j];  //存子串
        }
        data[h].sn = h;
        h++;//子串个数
    }
    //统计每个子串的GC个数
    for (int i = 0; i < h; i++) {
        //遍历子串,计算GC-Ratio
        for (int j = 0; j < num; j++) {
            if ((data[i].str_child[j] == 'G') || data[i].str_child[j] == 'C') {
                data[i].gc_cnt += 1;
            }
        }
    }
	//计算GC-Ratio
    for (int i = 0; i < h; i++) {
        data[i].Ratio = (float)data[i].gc_cnt / num;
    }
    for (int i = 0; i < h; i++) {
        for (int j = i + 1; j < h; j++) {

            if (data[i].Ratio > data[j].Ratio) {
                temp = data[i];
                data[i] = data[j];
                data[j] = temp;
            }
        }
    }
    //比较最大值和所有的值是否最大,如果有和最大值一样的值,输出最先出现的那个
    int outNum = h - 1;
    for (int i = 0; i < h; i++) {
        if (data[outNum].Ratio == data[i].Ratio) {
            //输出序号最小的那个
            if (data[i].sn < data[outNum].sn) {
                outNum = i;
            }
        }
    }
    printf("%s",data[outNum].str_child);

    return 0 ;
}