题目描述
给你一个长度为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"。- 选择
"0100","101001"→"100001"→"111111"。- 最终的字符串去掉两端的
'1'后为"1111"。最大活跃区段数为 4。
示例 3:
输入:
s = "1000100"
输出:7
解释:
- 字符串
"1000100"→ 两端加上'1'后得到"110001001"。- 选择
"000100","110001001"→"110000001"→"111111111"。- 最终的字符串去掉两端的
'1'后为"1111111"。最大活跃区段数为 7。
示例 4:
输入:
s = "01010"
输出:4
解释:
- 字符串
"01010"→ 两端加上'1'后得到"1010101"。- 选择
"010","1010101"→"1000101"→"1111101"。- 最终的字符串去掉两端的
'1'后为"11110"。最大活跃区段数为 4。
提示
1 <= n == s.length <= 10^5s[i]仅包含'0'或'1'
苯人思路
classSolution{public:intmaxActiveSectionsAfterTrade(string s){charnowNumber=s[0];intcount01=0;vector<int>q;for(auto&c:s){if(c==nowNumber)count01++;else{q.emplace_back(count01);count01=1;nowNumber='1'-(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;intn=q.size();intmax=0;intmaxIndex=0;for(inti=0;i<n-4;i+=2){// 找能改变最多0的位置inttemp=q[i+1]+q[i+3];if(temp>max){max=temp;maxIndex=i;}}intanswer=0;// 累加所有1的数量for(inti=0;i<n;i+=2)answer+=q[i];// 再加上0变成1的个数answer+=q[maxIndex+1]+q[maxIndex+3];// 减去收尾两端的2个1returnanswer-2;}};