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
廣告