题目简述:
给你一个二进制字符串 binary ,它仅有 0 或者 1 组成。你可以使用下面的操作任意次对它进行修改:
操作 1 :如果二进制串包含子字符串 “00” ,你可以用 “10” 将其替换。比方说, “00010” -> “10010”
操作 2 :如果二进制串包含子字符串 “10” ,你可以用 “01” 将其替换。比方说, “00010” -> “00001”
请你返回执行上述操作任意次以后能得到的最大二进制字符串。(如果二进制字符串 x 对应的十进制数字大于二进制字符串 y 对应的十进制数字,那么我们称二进制字符串 x 大于二进制字符串 y 。)
思路分析:
根据测试案例找到操作及其结果的规律:
操作1:00—>10 从小变大(将高位的0变成1)。
操作2:10—>01 从大变小。其作用效果是将’0‘向左移动(但并不会减少’0’的数量),与原本位于左边的0相邻形成’00‘ 以便再执行操作1。
因此具体普遍规律的操作及结果是:先执行N次操作2使得第一个‘0’右边的‘0’都通过操作2移动到左边与其它‘0’相邻,形成以第一个‘0’为首的一串’0‘;再执行操作1将除了最后一个’0‘以外的左边连续的’0‘逐渐变为’1‘。(注意,第一个’0‘的位置很关键,是其他’0‘左移靠近的目标)最终得到仅有一个’0‘的最大值字符串。
根据操作结果的规律,我们可以直接得到最大值的结果。
示例代码:
class Solution:
def maximumBinaryString(self, binary: str) -> str:
zero_cnt = binary.count("0") # 统计0的个数
if zero_cnt <= 1:
return binary
else:
first_zero_ind = binary.index("0") # 第一个0所在的位置
last_zero_ind = first_zero_ind + zero_cnt - 1
return last_zero_ind * "1" + "0" + (len(binary) - last_zero_ind - 1) * "1"
算法复杂度
时间复杂度
O
(
n
)
O(n)
O(n) n代表binary的长度,时间消耗在于遍历binary字符串统计’0’的个数以及找到第一个’0’的位置(虽然在Python中直接调用了库函数str.count()和str.index(),但时间消耗依旧存在);
空间复杂度
O
(
n
)
O(n)
O(n) n代表binary的长度,空间消耗在于输出变更后的字符串;