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

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

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

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

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

## PHP

 ` `

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.