3499. 操作后最大活跃区段数 I(2026.07.21)

📅 2026/7/22 1:34:35
3499. 操作后最大活跃区段数 I(2026.07.21)
题目描述给你一个长度为n的二进制字符串s其中1表示一个活跃区段。0表示一个非活跃区段。你可以执行最多一次操作来最大化s中的活跃区段数量。在一次操作中你可以将一个被0包围的连续1区块转换为全0。然后将一个被1包围的连续0区块转换为全1。返回在执行最优操作后s中的最大活跃区段数。注意处理时需要在s的两侧加上1即t 1 s 1。这些加上的1不会影响最终的计数。示例 1输入s 01输出1解释因为没有被0包围的1区块因此无法进行有效操作。最大活跃区段数为 1。示例 2输入s 0100输出4解释字符串0100→ 两端加上1后得到101001。选择0100101001→100001→111111。最终的字符串去掉两端的1后为1111。最大活跃区段数为 4。示例 3输入s 1000100输出7解释字符串1000100→ 两端加上1后得到110001001。选择000100110001001→110000001→111111111。最终的字符串去掉两端的1后为1111111。最大活跃区段数为 7。示例 4输入s 01010输出4解释字符串01010→ 两端加上1后得到1010101。选择0101010101→1000101→1111101。最终的字符串去掉两端的1后为11110。最大活跃区段数为 4。提示1 n s.length 10^5s[i]仅包含0或1苯人思路classSolution{public:intmaxActiveSectionsAfterTrade(string s){charnowNumbers[0];intcount010;vectorintq;for(autoc:s){if(cnowNumber)count01;else{q.emplace_back(count01);count011;nowNumber1-(nowNumber-0);}}q.emplace_back(count01);// 添加最后的1if(s.back()1)q.back();elseq.emplace_back(1);// 添加最前的1if(s[0]1)q[0];elseq.insert(q.begin(),1);// 无法进行有效操作if(q.size()1)returnq[0]-2;if(q.size()3)returnq[0]q[2]-2;intnq.size();intmax0;intmaxIndex0;for(inti0;in-4;i2){// 找能改变最多0的位置inttempq[i1]q[i3];if(tempmax){maxtemp;maxIndexi;}}intanswer0;// 累加所有1的数量for(inti0;in;i2)answerq[i];// 再加上0变成1的个数answerq[maxIndex1]q[maxIndex3];// 减去收尾两端的2个1returnanswer-2;}};