填充
题目
思路
这个题目在我看来,还是和打家劫舍一样样。
为什么这么说?
这里,题目中说到我们需要构建00或者是11串,换句话说就是,我们需要找出有多少对相同成对
这里我们需要把两个看成是一个房子,然后就是隔壁的不能同时重复选择就好啦。
所以我们需要定义一个f[i],用来表示s的前i个字符中构成的最多的成对的。
因为是隔壁的不能选,而这里是两个转移态,所以两个转移态是f[i-2]和f[i-1],分别对应选和不选
具体参考下面的图(我感觉我画图可能会更加直观一些,哈哈,大家多多体谅一下)
浓缩成图
看到这里基本上写代码就没啥问题了,下面是我们的代码
完整代码
s = input()
n = len(s)
f = [0]*n
for i in range(1, n):
f[i] = f[i-1]
if s[i] == s[i-1] or s[i] == '?' or s[i-1] == '?':
f[i] = max(f[i-2]+1, f[i])
print(f[-1])