1 class Solution
2 {
3 public:
4 int minFlipsMonoIncr(string S)
5 {
6 vector<int> left2CountOne (S.size(),0);
7 vector<int> right2CountZero (S.size(),0);
8
9 for(int i = 0;i < S.size();i ++)
10 {
11 if(S[i]=='1')
12 {
13 if(i==0)
14 left2CountOne[i] = 1;
15 else
16 left2CountOne[i] = left2CountOne[i-1] + 1;
17 }
18 else if(S[i]=='0' && i!=0)
19 left2CountOne[i] = left2CountOne[i-1];
20 }
21
22 for(int i = S.size()-1;i >= 0 ;i --)
23 {
24 if(S[i]=='0')
25 {
26 if(i==S.size()-1)
27 right2CountZero[i] = 1;
28 else
29 right2CountZero[i] = right2CountZero[i+1] + 1;
30 }
31 else if(S[i]=='1' && i != S.size()-1)
32 right2CountZero[i] = right2CountZero[i+1];
33 }
34
35 int result = right2CountZero[0];
36 for(int i = 0;i < S.size()-1;i ++)
37 {
38 if(left2CountOne[i]+right2CountZero[i+1] < result)
39 result = left2CountOne[i]+right2CountZero[i+1];
40 }
41 if(result > left2CountOne[S.size()-1])
42 result = left2CountOne[S.size()-1];
43 // cout << left2CountOne[S.size()-1] << endl;
44 return result;
45 }
46 };