Maximum difference of zeros and ones in binary string | Set 2 (O(n) time)

Given a binary string of 0s and 1s. The task is to find the maximum difference between the number of 0s and number of 1s in any sub-string of the given binary string. That is maximize ( number of 0s – number of 1s ) for any sub-string in the given binary string.

Examples:

Input : S = "11000010001"
Output : 6
From index 2 to index 9, there are 7
0s and 1 1s, so number of 0s - number
of 1s is 6.

Input : S = "1111"
Output : -1



We have discussed Dynamic Programing approach in below post :
Maximum difference of zeros and ones in binary string | Set 1.

In the post we seen an efficient method that work in O(n) time and in O(1) extra space. Idea behind that if we convert all zeros into 1 and all ones into -1.now our problem reduces to find out the maximum sum sub_array Using Kadane’s Algorithm.

Input : S = "11000010001"
     After converting '0' into 1 and
     '1' into -1 our S Look Like
      S  = -1 -1 1 1 1 1 -1 1 1 1 -1
 Now we have to find out Maximum Sum sub_array 
 that is  : 6 is that case 
    
Output : 6

Below is the implementation of above idea.

C++

filter_none

edit
close

play_arrow

link
brightness_4
code

// CPP Program to find the length of
// substring with maximum difference of
// zeros and ones in binary string.
#include <iostream>
using namespace std;
  
// Returns the length of substring with
// maximum difference of zeroes and ones 
// in binary string
int findLength(string str, int n)
{
    int current_sum = 0;
    int max_sum = 0;
  
    // traverse a binary string from left 
    // to right
    for (int i = 0; i < n; i++) {
  
        // add current value to the current_sum
        // according to the Character
        // if it's '0' add 1 else -1
        current_sum += (str[i] == '0' ? 1 : -1);
  
        if (current_sum < 0)
            current_sum = 0;
  
        // update maximum sum
        max_sum = max(current_sum, max_sum);
    }
  
    // return -1 if string does not contain
    // any zero that means all ones 
    // otherwise max_sum
    return max_sum == 0 ? -1 : max_sum;
}
  
// Driven Program
int main()
{
    string s = "11000010001";
    int n = 11;
    cout << findLength(s, n) << endl;
    return 0;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// Java Program to find the length of
// substring with maximum difference of
// zeroes and ones in binary string.
import java.util.*;
import java.lang.*;
import java.io.*;
  
class GFG {
  
    // Find the length of substring with maximum
    // difference of zeros and ones in binary
    // string
    public static int findLength(String str, int n)
    {
  
        int current_sum = 0;
        int max_sum = 0;
  
        // traverse a binary string from left to right
        for (int i = 0; i < n; i++) {
  
            // add current value to the current_sum
            // according to the Character
            // if it's '0' add 1 else -1
            current_sum += (str.charAt(i) == '0' ? 1 : -1);
  
            if (current_sum < 0)
                current_sum = 0;
  
            // update maxium sum
            max_sum = Math.max(current_sum, max_sum);
        }
        // return -1 if string does not contain any zero
        // that means string contains all ones otherwise max_sum
        return max_sum == 0 ? -1 : max_sum;
    }
  
    public static void main(String[] args)
    {
        String str = "11000010001";
        int n = str.length();
  
        System.out.println(findLength(str, n));
    }
}

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python Program to find the length of
# substring with maximum difference of
# zeros and ones in binary string.
  
# Returns the length of substring with
# maximum difference of zeroes and ones 
# in binary string
def findLength(string, n):
    current_sum = 0
    max_sum = 0
  
    # traverse a binary string from left 
    # to right
    for i in range(n):
  
        # add current value to the current_sum
        # according to the Character
        # if it's '0' add 1 else -1
        current_sum += (1 if string[i] == '0' else -1)
  
        if current_sum < 0:
            current_sum = 0
  
        # update maximum sum
        max_sum = max(current_sum, max_sum)
  
    # return -1 if string does not contain
    # any zero that means all ones 
    # otherwise max_sum
    return max_sum if max_sum else 0
  
# Driven Program
s = "11000010001"
n = 11
print(findLength(s, n))
  
# This code is contributed by Ansu Kumari.

chevron_right


C#

filter_none

edit
close

play_arrow

link
brightness_4
code

// C# Program to find the length of 
// substring with maximum difference of 
// zeroes and ones in binary string. 
using System;
  
class GFG
{
  
// Find the length of substring with 
// maximum difference of zeros and 
// ones in binary string 
public static int findLength(string str, 
                             int n)
{
  
    int current_sum = 0;
    int max_sum = 0;
  
    // traverse a binary string 
    // from left to right 
    for (int i = 0; i < n; i++)
    {
  
        // add current value to the current_sum 
        // according to the Character 
        // if it's '0' add 1 else -1 
        current_sum += (str[i] == '0' ? 1 : -1);
  
        if (current_sum < 0)
        {
            current_sum = 0;
        }
  
        // update maxium sum 
        max_sum = Math.Max(current_sum, max_sum);
    }
    // return -1 if string does not contain 
    // any zero that means string contains 
    // all ones otherwise max_sum 
    return max_sum == 0 ? -1 : max_sum;
}
  
// Driver Code
public static void Main(string[] args)
{
    string str = "11000010001";
    int n = str.Length;
  
    Console.WriteLine(findLength(str, n));
}
}
  
// This code is contributed by Shrikant13

chevron_right


PHP

filter_none

edit
close

play_arrow

link
brightness_4
code

<?php
// PHP Program to find the length of
// substring with maximum difference of
// zeros and ones in binary string.
  
// Returns the length of substring with
// maximum difference of zeroes and ones 
// in binary string
function findLength($str, $n)
{
    $current_sum = 0;
    $max_sum = 0;
  
    // traverse a binary string
    // from left to right
    for ($i = 0; $i < $n; $i++) 
    {
  
        // add current value to the current_sum
        // according to the Character
        // if it's '0' add 1 else -1
        $current_sum += ($str[$i] == '0' ? 1 : -1);
  
        if ($current_sum < 0)
            $current_sum = 0;
  
        // update maximum sum
        $max_sum = max($current_sum, $max_sum);
    }
  
    // return -1 if string does not contain
    // any zero that means all ones 
    // otherwise max_sum
    return $max_sum == 0 ? -1 : $max_sum;
}
  
    // Driver Code
    $s = "11000010001";
    $n = 11;
    echo findLength($s, $n),"\n";
      
// This code is contributed by aj_36
?>

chevron_right



Output:

6 

Time Complexity : O(n)
Space complexity : O(1)



My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.