【发布时间】:2022-01-04 16:52:23
【问题描述】:
问题:给定一个二进制字符串(仅包含“1”或“0”),求获得所有“1”的二进制字符串所需的最少翻转次数。
执行翻转时,该索引处的值将从“0”变为“1”或从“1”变为“0”。 您可以进行的唯一翻转是双打或三打。这意味着当执行翻转时,必须在两个或三个相邻索引上执行。 示例:
对于二进制字符串“1010”,所需的最小翻转次数为 2。“1010”=>“1001”=>“1111”(结束) 对于“10001”,所需的最小翻转次数为 1。“10001”=>“11111”(结束)
这个问题已经在 StackOverflow 上的一篇文章中讨论过了。但逻辑并没有得到适当的讨论。这是那里存在的唯一解决方案,并且解释不足以正确理解它。有人可以解释解决方案背后的逻辑吗 或任何其他解决此问题的方法。
def minFlips(s):
if "0" not in s: return 0 # all 1s, no flip needed
if s in ("00","000"): return 1 # last flip for whole string
def flip(n): # flip 1st n bits
return s[:n].translate({48:49,49:48})+s[n:]
result = [float('inf')] # track minimum flips
if s.startswith("0"): # must flip if starting with a zero
if len(s)>2: # first 2 + recursion
result.append(1+minFlips(flip(2)[1:]))
if len(s)>3: # first 3 + recursion
result.append(1+minFlips(flip(3)[1:]))
else: # starts with "1"
result.append(minFlips(s[1:])) # 0 flip + recursion
if "0" in s[:2]: # can flip zero at 2nd position
result.append(1+minFlips(flip(2))) # first 2 + recursion
if "0" in s[:3]: # can flip zero at 2nd or 3rd position
result.append(1+minFlips(flip(3))) # first 3 + recursion
return min(result)
print(minFlips("1010")) # 2
print(minFlips("10001")) # 1
print(minFlips("1010110101")) # 4
有人可以帮我简化一下吗? 非常感谢
【问题讨论】:
-
这似乎不是java代码而是python代码
-
为什么这个标签是java?也许您应该通过实际标记您想要帮助的适当语言来使您期望帮助的人更容易。
-
@OHGODSPIDERS 我对 python 不是很熟悉,这就是为什么我认为有人可以用 Java 或 c++ 回答它,这对我来说更容易理解。
-
能否提供您找到此代码的链接?
标签: java algorithm recursion greedy