Python程序:求解从二进制字符串中移除“10”或“01”后可获得的最大分数
假设我们有一个二进制字符串s和两个值zero_one和one_zero。现在让我们考虑一个操作,我们可以删除任何子字符串“01”并获得zero_one分。或者我们可以删除任何子字符串“10”并获得one_zero分。我们必须找到在任何数量的操作后可以获得的最大分数。
因此,如果输入类似于s = "10100101" zero_one = 3 one_zero = 2,则输出将为11,因为我们可以删除三次“01”以获得3*3 = 9分。然后剩余的字符串是10。通过删除它,我们可以获得另外2分,所以总分是11。
为了解决这个问题,我们将遵循以下步骤:
A := 一个作为输入字符串给出的位列表
如果zero_one < one_zero,则
交换zero_one和one_zero
对于范围为0到A大小的i,执行:
A[i] := A[i] XOR 1
ans := 0
stack := 一个新的栈
对于A中的每个x,执行:
如果栈非空且栈顶元素 < x,则
从栈中弹出
ans := ans + zero_one
否则,
将x压入栈
ans := ans + one_zero * min(栈中0的出现次数, 栈中1的出现次数)
返回ans
示例(Python)
让我们看下面的实现来更好地理解:
class Solution: def solve(self, S, zero_one, one_zero): A = list(map(int, S)) if zero_one < one_zero: zero_one, one_zero = one_zero, zero_one for i in range(len(A)): A[i] ^= 1 ans = 0 stack = [] for x in A: if stack and stack[-1] < x: stack.pop() ans += zero_one else: stack.append(x) ans += one_zero * min(stack.count(0), stack.count(1)) return ans ob = Solution() s = "10100101" zero_one = 3 one_zero = 2 print(ob.solve(s, zero_one, one_zero))
输入
"10100101", 3, 2
输出
11
广告