题目:
给你一个二进制字符串 binary
,它仅有 0
或者 1
组成。你可以使用下面的操作任意次对它进行修改:
- 操作 1 :如果二进制串包含子字符串
"00"
,你可以用"10"
将其替换。- 比方说,
"00010" -> "10010"
- 比方说,
- 操作 2 :如果二进制串包含子字符串
"10"
,你可以用"01"
将其替换。- 比方说,
"00010" -> "00001"
- 比方说,
请你返回执行上述操作任意次以后能得到的 最大二进制字符串 。如果二进制字符串 x
对应的十进制数字大于二进制字符串 y
对应的十进制数字,那么我们称二进制字符串 x
大于二进制字符串 y
。
思考:
操作1:“00” ----> “10”
操作2:“10” ----> “01”
那么对于任意二进制字符串来说,要使得变换后的值最大,那么,
- 前面的“1”都不用变换;
- 设字符串为“1...10...01+?” (从第一个“0”开始,它和与其相邻连续的k个“0”可以转换成k个“1”和一个“0”使字符串更大) ----> 设这里的第一个“0”位置为k(下标从0开始)
- “?”部分中的“0”可以通过操作2全部移到标红的“1”的前面,也就是与前面的连续的“0”连起来,这样字符串就变成“1...10...01...1”(*),其中“0”和“1”的个数分别与原始字符串相同。 ----> 设一共有n个“0”
- 然后再通过操作1将中间的n个“0”变成n-1个“1”和一个“0”,字符串变成“1...101...1”(**)。 ----> 唯一的“0”位置即为字符串(*)中最后一个“0”的位置,即k+n-1
- 那么问题就变成找到这个唯一的“0”的位置,就能得到最后的字符串。上述文本中加粗部分即为思路。
代码如下:
class Solution(object):
def maximumBinaryString(self, binary):
"""
:type binary: str
:rtype: str
"""
n = len(binary)
s = list(binary)
k = -1
m = 0
res = ''
for i in range(0, n):
if s[i] == '0' and k == -1:
k = i # 找到第一个0的位置
if s[i] == '0':
m += 1 # 统计0的个数
for j in range(0, n):
# 得到最终的字符串,第k+m-1个位置为0,其他位置都为1
if j == k+m-1:
res += '0'
else:
res += '1'
return res
提交通过: