LeetCode 926. 將字符串翻轉到單調遞增

原題地址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記錄其連續的01的個數。例如"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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章