A string of '0'
s and '1'
s is monotone increasing if it consists of some number of '0'
s (possibly 0), followed by some number of '1'
s (also possibly 0.)
We are given a string S
of '0'
s and '1'
s, and we may flip any '0'
to a '1'
or a '1'
to a '0'
.
Return the minimum number of flips to make S
monotone increasing.
Example 1:
Input: "00110" Output: 1 Explanation: We flip the last digit to get 00111.
Example 2:
Input: "010110" Output: 2 Explanation: We flip to get 011111, or alternatively 000111.
Example 3:
Input: "00011000" Output: 2 Explanation: We flip to get 00000000.
Note:
1 <= S.length <= 20000
S
only consists of'0'
and'1'
characters.
思路:DP
class Solution:
def minFlipsMonoIncr(self, s):
"""
:type S: str
:rtype: int
"""
dp=[[0,0] for _ in range(len(s))]
if s[0]=='0': dp[0][1]=1
else: dp[0][0]=1
for i in range(1,len(s)):
if s[i]=='0':
dp[i][0]=dp[i-1][0]
dp[i][1]=min(dp[i-1])+1
else:
dp[i][0]=dp[i-1][0]+1
dp[i][1]=min(dp[i-1])
return min(dp[-1])
s=Solution()
print(s.minFlipsMonoIncr('00110'))
print(s.minFlipsMonoIncr('010110'))
print(s.minFlipsMonoIncr('00011000'))