1702.修改后的最大二进制字符串
【LetMeFly】1702.修改后的最大二进制字符串:脑筋急转弯(构造,贪心)
力扣题目链接:https://leetcode.cn/problems/maximum-binary-string-after-change/
给你一个二进制字符串 binary
,它仅有 0
或者 1
组成。你可以使用下面的操作任意次对它进行修改:
- 操作 1 :如果二进制串包含子字符串
"00"
,你可以用"10"
将其替换。<ul> <li>比方说, <code>"<strong>00</strong>010" -> "<strong>10</strong>010"</code></li> </ul> </li> <li>操作 2 :如果二进制串包含子字符串 <code>"10"</code> ,你可以用 <code>"01"</code> 将其替换。 <ul> <li>比方说, <code>"000<strong>10</strong>" -> "000<strong>01</strong>"</code></li> </ul> </li>
请你返回执行上述操作任意次以后能得到的 最大二进制字符串 。如果二进制字符串 x
对应的十进制数字大于二进制字符串 y
对应的十进制数字,那么我们称二进制字符串 x
大于二进制字符串 y
。
示例 1:
输入:binary = "000110" 输出:"111011" 解释:一个可行的转换为: "000110" -> "000101" "000101" -> "100101" "100101" -> "110101" "110101" -> "110011" "110011" -> "111011"
示例 2:
输入:binary = "01" 输出:"01" 解释:"01" 没办法进行任何转换。
提示:
1 <= binary.length <= 105
binary
仅包含'0'
和'1'
。
解题方法:构造(贪心)
题目分析
如果给定字符串中没有0
,则不在本次讨论的范围之列,直接返回原字符串。
推论1:最终字符串中一定有0
仅有的两种变换分别是00->10
和10->01
,只能减少0
的个数,但永远不可能将所有0
消除。
推论2:最终字符串中一定只有一个0
以10111011
为例,该字符串中有两个0
,则可以进行以下变换10111011->10011111->11011111
,具体变换过程如下:
1 |
|
也就是说,假设最终字符串中有两个0
,那么后面的那个0
一定可以通过10->01
的变换与前面的0
相邻,相邻两个0
再通过00->10
变换,使得第一个0
变成了1
,字符串值更大了。
若有多个0
则同理,最终一定只剩下一个0
,变成111..11011..111
的形态。
为什么不继续变化了呢?因为11
、01
都不可变,唯一可变的是10->01
。但是这么变的话相当于“0
往前移”了,字符串值更小,不可取。
如何判断最终字符串中0的位置?
由给定的两种变换00->10
和10->01
可以发现,0
要么被消除(变换一)要么左移(变换二),单纯的左移会导致字符串变小,因此尽量将最前面的0
“消除”。
如何消除?通过变换一消除。通过推论2我们知道,只要存在两个0
,则右边的0
必定能千里迢迢地来到左边的0
身边并与之进行变换一:
1 |
|
也就是说,第一个0
的右边每存在一个0
,就能让第一个0
的位置“右移一位”。
最终第一个0
(也就是唯一的一个0
)的位置,是原始字符串中第一个0
的位置,再右移$0的总个数 - 1$位。
具体方法
给定字符串,统计其中0
的个数(记为cnt0
)。
若无0
,则直接返回原始字符串;否则继续。
找到字符串中第一个0
的位置(记为pos0
),构造一个只有pos0 + cnt0 - 1
这个位置为0
其余位置全部为1
的字符串并返回。
时空复杂度分析
- 时间复杂度$O(len(binary))$
- 空间复杂度$O(len(binary))$:空间复杂度来自字符串构造过程中的临时变量。
AC代码
C++
1 |
|
Python
1 |
|
同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/137593422