思路:

  1. 先获取符合条件的最大数量,并用max记录下来
  2. 再用两个指针开始遍历,其中右指针为输入(遇到符合的条件就需要++)++,左指针为输出--。
  3. 每次循环后需要再次判断最大值并更新,并且用index记录更新后的开始地址。(用来判断GC-Ratio最高)
  4. 这样,即使后面有同样符合的条件,max和index都不会更新。(保证了输出的为第一个符合的条件)
  5. 然后输出该地址后要求的长度即可
#include <stdio.h>

int main()
{
    char str[1000] = {0};
    int num = 0;
    scanf("%s", str);
    scanf("%d", &num);
    int len = strlen(str);
    int cntGC = 0;
    int max = 0;
    for(int i = 0; i < len; i++)
    {
        if(str[i] == 'G' || str[i] == 'C')
        {
            cntGC++;
        }
    }
    
    max = cntGC;
    
    int index = 0;
    int left = 0;        //左指针,指向开头
    int right = num;    //右指针,指向要输出的结尾
    for(int i = 0; i < len-num; i++)
    {
        /* 右指针向判断是否是符合的条件,是就++,并向后移动 */
        if(str[right] == 'G' || str[right] == 'C')
        {
            cntGC++;
        }
        right++;
        
        /* 左指针向判断是否是符合的条件,是就--,并向后移动 */
        if(str[left] == 'G' || str[left] == 'C')
        {
            cntGC--;
        }
        left++;
        
        /* 判断最大的GC数量,并记录坐标 */
        if(max < cntGC)
        {
            max = cntGC;
            index = left;
        }
    }
    
    /* 输出开始位置为index坐标点,输出长度为num */
    printf("%.*s\n", num, &str[index]);
    return 0;
}
/*
测试用例:
AACTGTGCACGACCTGA
5

字符串总长为17,GC个数最大为9
其中,
第一个符合条件的坐标值为6,
第二个符合条件的坐标值为9.
但最大值都相同,所以输出第一个
*/

/* 输出示例 */
i:[0], max:[9], cntGC:[9], index:[0]
i:[1], max:[10], cntGC:[10], index:[2]
i:[2], max:[10], cntGC:[10], index:[2]
i:[3], max:[10], cntGC:[10], index:[2]
i:[4], max:[10], cntGC:[10], index:[2]
i:[5], max:[11], cntGC:[11], index:[6]
i:[6], max:[11], cntGC:[10], index:[6]
i:[7], max:[11], cntGC:[10], index:[6]
i:[8], max:[11], cntGC:[11], index:[6]
i:[9], max:[11], cntGC:[10], index:[6]
i:[10], max:[11], cntGC:[10], index:[6]
i:[11], max:[11], cntGC:[10], index:[6]
GCACG