问题描述
给一串二进制字符串如00011001,希望把他改为全为0,如果更改某个字符,那么他两边的字符也要更改,例如把第二位的0换成1,那么就变成了11111001. 求最少翻转次数。如果无法全0,输出NO。
问题解析
因为每翻转当前字符,其相邻字符也会翻转,所以每当遇见为1的字符时,将它下一个的字符进行翻转。因为这样做可以保证之前的字符全部为0,即本次翻转不会影响之前的结果。如此循环迭代之后,判断最后一个是否为0即可。
代码解析
def flip(s, i):
def __flip(s, i):
s = s[:i] + str(1 - int(s[i])) + s[i + 1:]
return s
s = __flip(s, i - 1)
s = __flip(s, i)
if i < len(s) - 1:
s = __flip(s, i + 1)
return s
def judge(s: str):
cnt = 0
n = len(s)
for i in range(n - 1):
if s[i] == '1':
s = flip(s, i + 1)
cnt += 1
return cnt if s[n - 1] == '0' else -1
s = input()
res = judge(s)
if res == -1:
print('No')
else:
print(res)
二进制字符串翻转算法

本文介绍了一种算法,用于将二进制字符串通过最少次数的翻转操作变为全0状态。每次翻转不仅改变当前字符,还改变其相邻字符的状态。文章详细解释了算法的实现逻辑,并提供了一个具体的Python代码示例。
8213

被折叠的 条评论
为什么被折叠?



