zoukankan      html  css  js  c++  java
  • 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;
        }
      
    }
  • 相关阅读:
    [ python ] 函数的参数
    [ python ] 文件读写操作
    [ python ] 集合的使用
    [ python ] 购物系统
    [ python ] 字符编码
    [ python ] 字典的使用
    [ python ] 列表和元组
    [ python ] 字符串的操作及作业题
    [ python ] 格式化输出、字符集、and/or/not 逻辑判断
    [ python ] 变量及基础的数据类型
  • 原文地址:https://www.cnblogs.com/ethanhong/p/10276597.html
Copyright © 2011-2022 走看看