如果一个由 '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'
C
int minFlipsMonoIncr(char* S)
{
int n=strlen(S);
int count0=0;
int count1=0;
for(int i=0;i<n;i++)
{
if('0'==S[i])
{
count0++;
}
else
{
count1++;
}
}
int left0=0;
int left1=0;
int right0=count0;
int right1=count1;
int min=n;
for(int i=0;i<n;i++)
{
if('0'==S[i])
{
left0++;
right0--;
}
else
{
left1++;
right1--;
}
int tmp=left1+right0;
min=min<tmp?min:tmp;
}
int count=count0<count1?count0:count1;
return min<count?min:count;
}
C++
class Solution {
public:
int minFlipsMonoIncr(string S)
{
int n=S.length();
int count0=0;
int count1=0;
for(int i=0;i<n;i++)
{
if('0'==S[i])
{
count0++;
}
else
{
count1++;
}
}
int left0=0;
int left1=0;
int right0=count0;
int right1=count1;
int min_val=INT_MAX;
for(int i=0;i<n;i++)
{
if('0'==S[i])
{
left0++;
right0--;
}
else
{
left1++;
right1--;
}
min_val=min(min_val,left1+right0);
}
return min(min(count0,count1),min_val);
}
};
python
class Solution:
def minFlipsMonoIncr(self, S):
"""
:type S: str
:rtype: int
"""
n=len(S)
count0=0
count1=0
for i in range(n):
if '0'==S[i]:
count0+=1
else:
count1+=1
left0=0
left1=0
right0=count0
right1=count1
min_val=n
for i in range(n):
if '0'==S[i]:
left0+=1
right0-=1
else:
left1+=1
right1-=1
min_val=min(min_val,left1+right0)
return min(min(count0,count1),min_val)