原題地址926. 將字符串翻轉到單調遞增
如果一個由 '0'
和 '1'
組成的字符串,是以一些 '0'
(可能沒有 '0'
)後面跟着一些 '1'
(也可能沒有 '1'
)的形式組成的,那麼該字符串是單調遞增的。
我們給出一個由字符 '0'
和 '1'
組成的字符串 S
,我們可以將任何 '0'
翻轉爲 '1'
或者將 '1'
翻轉爲 '0'
。
返回使 S
單調遞增的最小翻轉次數。
示例 1:
輸入:"00110"
輸出:1
解釋:我們翻轉最後一位得到 00111.
示例 2:
輸入:"010110"
輸出:2
解釋:我們翻轉得到 011111,或者是 000111。
示例 3:
輸入:"00011000"
輸出:2
解釋:我們翻轉得到 00000000。
提示:
1 <= S.length <= 20000
S 中只包含字符 '0' 和 '1'
算法
先把字符串轉換成數組形式cal記錄其連續的0或1的個數。例如"0001100"轉換成[3,2,2,0];"1110"轉換成[0,3,1,0]。
因此cal中偶數位對應"0",奇數位對應"1"。讓最終的字符串遞增,就是找到一個位置i,使得之前的都爲"0",之後的都爲"1"。
也就是把i之前的奇數位全翻轉,之後的偶數位全翻轉。
代碼
class Solution:
def minFlipsMonoIncr(self, S):
"""
:type S: str
:rtype: int
"""
tmp, tmpcal = 0, 0
cal = []
for s in S:
if s == str(tmp):
tmpcal += 1
else:
tmp = 1 - tmp
cal.append(tmpcal)
tmpcal = 1
cal.append(tmpcal)
if tmp == 0:
cal.append(0)
to0, to1 = 0, 0
for i in range(0, len(cal), 2):
to1 += cal[i]
ans = to0 + to1
for i in range(0, len(cal), 2):
ans = min(ans, to0 + to1 - cal[i])
to0 += cal[i + 1]
to1 -= cal[i]
ans = min(ans, to0 + to1)
return ans