问题描述
给一串二进制字符串如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)