3499. 操作后最大活跃区段数 I(2026.07.21)
2026/7/22 1:34:30 网站建设 项目流程

题目描述

给你一个长度为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^5
  • s[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;}};

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询