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