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

23 Jun, 2022
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 Programming 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++
Java
Python3
C#
PHP
Javascript
// 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 stringint 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 Programint main(){    string s = "11000010001";    int n = 11;    cout << findLength(s, n) << endl;    return 0;}
// 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 maximum 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));    }}
# 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 stringdef 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 Programs = "11000010001"n = 11print(findLength(s, n)) # This code is contributed by Ansu Kumari.
// 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 stringpublic 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 maximum 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 Codepublic static void Main(string[] args){    string str = "11000010001";    int n = str.Length;     Console.WriteLine(findLength(str, n));}} // This code is contributed by Shrikant13
<?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 stringfunction 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?>
<script> // JavaScript program to find the length of// substring with maximum difference of// zeroes and ones in binary string. // Find the length of substring with// maximum difference of zeros and// ones in binary stringfunction findLength(str, n){       let current_sum = 0;    let max_sum = 0;       // traverse a binary string    // from left to right    for (let 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 = 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     let str = "11000010001";    let n = str.length;       document.write(findLength(str, n));             // This code is contributed by chinmoy1997pal.</script>
Output: 
6 
Time Complexity: O(n) Space complexity: O(n), since string gets copied when we pass it to a function. 
jit_t
Sagar Pant 1
shrikanth13
chinmoy1997pal
sweetyty
anikaseth98
anikakapoor
rohitmishra051000
binary-string
Dynamic Programming
Strings
Strings
Dynamic Programming
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Longest Palindromic Substring | Set 1
Floyd Warshall Algorithm | DP-16
Sieve of Eratosthenes
Bellman–Ford Algorithm | DP-23
Travelling Salesman Problem | Set 1 (Naive and Dynamic Programming)
Write a program to reverse an array or string
Reverse a string in Java
Write a program to print all permutations of a given string
C++ Data Types
Check for Balanced Brackets in an expression (well-formedness) using Stack