初始化max_count写错卡了很久。

开始设定max = 0,觉得任意数值都>0,都能被记录,忘记第一次循环判断是从初始窗口的下一个窗口开始的。

  1. 当使用int max = 0;时,函数将寻找包含’C’和’G’字符数量大于当前窗口起始时数量的任何子串。如果起始窗口已经是包含’C’和’G’字符数量最多的子串,则函数可能不会更新max和pos。
  2. 当使用int max = count;时,函数将从当前窗口的’C’和’G’字符数量开始,并寻找包含更多’C’和’G’字符的子串。这意味着,如果存在包含更多’C’和’G’字符的子串,它将更新max和pos;如果不存在,则保持初始窗口为最长子串。
#include <iostream>
using namespace std;
void longestS(string s, int N){
    int pos = 0;//最长字串定位

    //窗口始值
    int count = 0;
    for(int i = 0; i < N; i ++){
        if(s[i] == 'C' || s[i] == 'G') count ++;
    } 

    //窗口移动
    int max = count; //报错的地方
    for(int head = 0, tail = N - 1; tail < s.length(); head ++, tail ++){
        if((s[head] == 'C' || s[head] == 'G')) count --;
        if((s[tail + 1] == 'C' || s[tail + 1] == 'G') && (tail + 1 < s.length())) count ++;


        if(count > max){
            max = count;
            pos = head + 1;
        }
    }

    for(int i = 0; i < N; i ++){
        cout << s[pos + i];
    }

    return;
}

int main() {
    string s;
    getline(cin, s);
    int N;
    cin >> N;

    longestS(s, N);
    return 0;
}
// 64 位输出请用 printf("%lld")