本文主要是介绍Leetcode-1702-修改后的最大二进制字符串-c++,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目详见https://leetcode.cn/problems/maximum-binary-string-after-change/
官方题解
我们从字符串左边第一位开始依次遍历,如果是 1 则不用改变,如果是 0,我们则想办法将其变成 1。 我们会找到下一位出现的 0,利用操作 2 我们可以使得这两个 0 相邻,再使用操作 1 使得 00 变成 10。 我们依次执行这个操作,直到字符串中没有第二个 0,或者达到字符串结尾。
几个关键点
- 最终整个字符串里面只会有一个0
- 按照题解的意思,我们找到第一个0之后继续往后找,直到找到第二个0,期间有着几种情况:
{第一个0后面立马找到第二个0;}
- 此时的情况是00,可以直接利用规则1变成10(最大)
{第一个0后面隔了几个1,然后才找到第二个0;}
- 此时第二个0前面一定有1,所以此时对于第二个0他现在的处境是10
- 此时按照规则2可以将10变成01
- 我们可以大致看到10这种组合结合规则2可以让我们把0往前"搬"一位,得到01
- 此时如果第一个0后面隔了几个1,那么我们只需要不断调用规则2就好了,最终一定会得到00
{没有找到找到第二个0;}
- 那此时就是01的情况了,束手无策。
注释代码
class Solution {
public:string maximumBinaryString(string binary) {int n = binary.size();int j = 0;for(int i = 0; i < n; i++){if(binary[i] == '0'){// 在字符串中找到下一个'0'的位置,这个位置要么在i之后,要么在字符串中第一个为'0'的位置while(j <= i || (j < n && binary[j] == '1')){j++;}if(j < n){// 结合上面几个关键点中的第二个关键点的第二种情况,// 我们实际上是吧第二个0搬到了第一个0后面凑出00,// 然后使用规则1将00变成较大的10binary[i] = '1'; // 00变成的10中的1binary[j] = '1'; // 原本的第二个0binary[i + 1] = '0'; // 00变成的10中的0}}}return binary;}
};
笔者也在新手学习期中,所写的内容主要与大家交流学习使用,如有发现任何问题敬请指正!
这篇关于Leetcode-1702-修改后的最大二进制字符串-c++的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!