题目链接: DNA序列
题目要求在给出的字符串中找出含有最多 'G' 或 'C' 长度为 N 的子串, 用滑动窗口求解即可, 题目中输入的 N 即为窗口大小, 定义两个变量 begin, end 遍历字符串, 当窗口大小小于 N 时, 通过移动 end 遍历字符串, 当窗口大小等于 N 时判断本次窗口中出现的 'G' 或 'C' 的次数是不是最大的, 是则更新数据, 当窗口大小大于 N 时, 移动 begin, 并更新窗口中的 'G' 或 'C' 的出现次数.
题解代码:
#include <iostream>
using namespace std;
int main()
{
string str;
int n;
cin >> str >> n;
//窗口区间[begin,end]
int begin = 0;
int end = 0;
int maxGC = 0; //存储GC比例最高的次数
int maxGC_begin = 0;
int tmp = 0;
while(end < str.size())
{
if(str[end] == 'G' || str[end] == 'C')
{
tmp++;
}
//窗口大小大于n,需要缩小窗口
if(end - begin == n)
{
if(str[begin] == 'G' || str[begin] == 'C')
{
tmp--;
}
begin++;
}
//窗口大小等于n,需要更新数据
if(end - begin == n - 1)
{
if(tmp > maxGC)
{
maxGC = tmp;
maxGC_begin = begin;
}
}
end++;
}
cout << str.substr(maxGC_begin, n) << endl;
return 0;
}