GFG App
Open App
Browser
Continue

# 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 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++

 `// CPP Program to find the length of` `// substring with maximum difference of` `// zeros and ones in binary string.` `#include ` `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;` `}`

## Java

 `// 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));` `    ``}` `}`

## Python3

 `# 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.`

## C#

 `// 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 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` `public` `static` `void` `Main(``string``[] args)` `{` `    ``string` `str = ``"11000010001"``;` `    ``int` `n = str.Length;`   `    ``Console.WriteLine(findLength(str, n));` `}` `}`   `// This code is contributed by Shrikant13`

## PHP

 ``

## Javascript

 ``

Output

`6`

Time Complexity: O(n)
Space complexity: O(n), since string gets copied when we pass it to a function.

My Personal Notes arrow_drop_up