初始化max_count写错卡了很久。
开始设定max = 0,觉得任意数值都>0,都能被记录,忘记第一次循环判断是从初始窗口的下一个窗口开始的。
- 当使用int max = 0;时,函数将寻找包含’C’和’G’字符数量大于当前窗口起始时数量的任何子串。如果起始窗口已经是包含’C’和’G’字符数量最多的子串,则函数可能不会更新max和pos。
- 当使用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")