LC 926. Flip String to Monotone Increasing

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. 1 <= S.length <= 20000
  2. S only consists of '0' and '1' characters.

 

Runtime: 19 ms, faster than 17.65% of Java online submissions for Flip String to Monotone Increasing.

 

package date20190116;

public class flipstringtomonoincreasing926 {


  public static int minFlipsMonoIncr(String S) {
    int[][] lefttoright = new int[S.length()][2];
    lefttoright[0][0] = S.charAt(0) == '0' ? 0 : 1;
    for(int i=1; i<S.length(); i++){
      lefttoright[i][0] = (S.charAt(i) == '0' ? 0 : 1) + lefttoright[i-1][0];
    }
    lefttoright[S.length()-1][1] = S.charAt(S.length()-1) == '1' ? 0 : 1;
    for(int i=S.length()-2; i>=0; i--){
      lefttoright[i][1] = (S.charAt(i) == '1' ? 0 : 1) + lefttoright[i+1][1];
    }
//    for(int[] x : lefttoright){
//      System.out.print(x[0] + " ");
//    }
    int ret = S.length();
    for(int i=0; i<S.length()-1; i++){
      ret = Math.min(ret, lefttoright[i][0]+lefttoright[i+1][1]);
    }
    ret = Math.min(ret, lefttoright[0][1]);
    ret = Math.min(ret, lefttoright[S.length()-1][0]);
    return ret;
  }
  public static void main(String[] args){
    String s = "00011000";
    minFlipsMonoIncr(s);

  }
}

 

another solution

 

Runtime: 12 ms, faster than 68.98% of Java online submissions for Flip String to Monotone Increasing.

 

class Solution {
    public int minFlipsMonoIncr(String S) {
      int[] dp = new int[S.length()+1];
      int N = S.length();
      for(int i=0; i < N; i++){
        dp[i+1] = dp[i] + (S.charAt(i) == '1' ? 1 : 0);
      }
      int ans = Integer.MAX_VALUE;
      for(int i=0; i<N+1; i++){
        ans = Math.min(ans, dp[i] + N-i - (dp[N] - dp[i]));
      }
      return ans;
    }
  
}

 

posted @ 2019-01-16 13:48  yuxihong  阅读(380)  评论(0编辑  收藏  举报