文章目录
- 题目
- 思路
- 代码
- 复杂度分析
- 时间复杂度
- 空间复杂度
- 结果
- 总结
题目
题目链接🔗
给你一个二进制字符串 b i n a r y binary binary ,它仅有 0 0 0 或者 1 1 1 组成。你可以使用下面的操作任意次对它进行修改:
操作 1 :如果二进制串包含子字符串 " 00 " "00" "00" ,你可以用 " 10 " "10" "10" 将其替换。
比方说, " 00010 " → " 10010 " "00010" \rightarrow "10010" "00010"→"10010"
操作 2 :如果二进制串包含子字符串 “10” ,你可以用 “01” 将其替换。
比方说, " 00010 " → " 00001 " "00010" \rightarrow "00001" "00010"→"00001"
请你返回执行上述操作任意次以后能得到的 最大二进制字符串 。如果二进制字符串 x x x 对应的十进制数字大于二进制字符串 y y y 对应的十进制数字,那么我们称二进制字符串 x x x 大于二进制字符串 y y y 。
示例 1:
输入:binary = “000110”
输出:“111011”
解释:一个可行的转换为:
“000110” -> “000101”
“000101” -> “100101”
“100101” -> “110101”
“110101” -> “110011”
“110011” -> “111011”
示例 2:
输入:binary = “01”
输出:“01”
解释:“01” 没办法进行任何转换。
提示:
- 1 ≤ b i n a r y . l e n g t h ≤ 1 0 5 1 \leq binary.length \leq 10^5 1≤binary.length≤105
- b i n a r y binary binary 仅包含 ′ 0 ′ '0' ′0′ 和 ′ 1 ′ '1' ′1′ 。
思路
要求通过操作将给定的二进制字符串转换为最大的二进制字符串。根据题目中的提示,可以利用贪心的思想来解决这个问题。
首先观察到在最终的答案中,不会出现连续的 0 0 0,比如说 " 00 " "00" "00"这种情况,因为可以通过操作 1 1 1 将其变为更大的字符串。所以我们可以先将所有的连续的 00 00 00 替换为 10 10 10。
其次,最终答案至多包含一个 0 0 0。如果原始字符串中存在 010 010 010,我们可以将最右边的 000 000 000 移动到最左边,然后将其变为 101 101 101。这样可以保证得到的字符串更大。
最后,如果原始字符串中全是 111 111 111,则无需进行任何操作,直接返回原字符串即可。
代码
class Solution {
public:string maximumBinaryString(string binary) {int len=binary.size();int lin=0;int linwei=-1;for(int i=0;i<len;++i){if(binary[i]=='0'){lin++;if(linwei==-1)linwei=i;}}string ans;for(int i=0;i<linwei+lin-1;++i)ans+='1';if(lin)ans+='0';else linwei=0;for(int i=linwei+lin;i<len;++i)ans+='1';return ans;}
};
复杂度分析
时间复杂度
O ( n ) O(n) O(n)
空间复杂度
O ( 1 ) O(1) O(1)
结果
总结
利用贪心的思想,通过统计连续0的数量和位置,并对字符串进行操作,使得得到的字符串尽可能大。通过遍历一次字符串,即可得到最终的结果。