# Longest substring with count of 1s more than 0s

Given a binary string find the longest substring which contains 1’s more than 0’s.

Examples:

Input : 1010 Output : 3 Substring 101 has 1 occuring more number of times than 0. Input : 101100 Output : 5 Substring 10110 has 1 occuring more number of times than 0.

A **simple** solution is to one by one consider all the substrings and check if that substring has count of 1 more than 0. If count is more than compare its length with maximum length substring found till now. Time complexity of this solution is O(n^2).

An **efficient** solution is to use hashing. The idea is to find sum of string traversed until now. Add 1 to the result if current character is ‘1’ else subtract 1. Now the problem reduces to finding largest subarray having sum greater than zero. To find largest subarray having sum greater than zero, we check the value of sum. If sum is greater than zero, then largest subarray with sum greater than zero is arr[0..i]. If sum is less than zero, then find size of subarray arr[j+1..i], where j is index upto which sum of subarray arr[0..j] is sum -1 and j < i and compare that size with largest subarray size found so far. To find index j, store values of sum for arr[0..j] in hash table for all 0 <= j <= i. There might be possibility that a given value of sum repeats. In that case store only first index for which that sum is obtained as it is required to get length of largest subarray and that is obtained from first index occurrence.

Below is the implementation of above approach:

`// CPP program to find largest substring ` `// having count of 1s more than count ` `// count of 0s. ` `#include <bits/stdc++.h> ` `using` `namespace` `std; ` ` ` `// Function to find longest substring ` `// having count of 1s more than count ` `// of 0s. ` `int` `findLongestSub(string bin) ` `{ ` ` ` `int` `n = bin.length(), i; ` ` ` ` ` `// To store sum. ` ` ` `int` `sum = 0; ` ` ` ` ` `// To store first occurrence of each ` ` ` `// sum value. ` ` ` `unordered_map<` `int` `, ` `int` `> prevSum; ` ` ` ` ` `// To store maximum length. ` ` ` `int` `maxlen = 0; ` ` ` ` ` `// To store current substring length. ` ` ` `int` `currlen; ` ` ` ` ` `for` `(i = 0; i < n; i++) { ` ` ` ` ` `// Add 1 if current character is 1 ` ` ` `// else subtract 1. ` ` ` `if` `(bin[i] == ` `'1'` `) ` ` ` `sum++; ` ` ` `else` ` ` `sum--; ` ` ` ` ` `// If sum is positive, then maximum ` ` ` `// length substring is bin[0..i] ` ` ` `if` `(sum > 0) { ` ` ` `maxlen = i + 1; ` ` ` `} ` ` ` ` ` `// If sum is negative, then maximum ` ` ` `// length substring is bin[j+1..i], where ` ` ` `// sum of substring bin[0..j] is sum-1. ` ` ` `else` `if` `(sum <= 0) { ` ` ` `if` `(prevSum.find(sum - 1) != prevSum.end()) { ` ` ` `currlen = i - prevSum[sum - 1]; ` ` ` `maxlen = max(maxlen, currlen); ` ` ` `} ` ` ` `} ` ` ` ` ` `// Make entry for this sum value in hash ` ` ` `// table if this value is not present. ` ` ` `if` `(prevSum.find(sum) == prevSum.end()) ` ` ` `prevSum[sum] = i; ` ` ` `} ` ` ` ` ` `return` `maxlen; ` `} ` ` ` `// Driver code ` `int` `main() ` `{ ` ` ` `string bin = ` `"1010"` `; ` ` ` `cout << findLongestSub(bin); ` ` ` `return` `0; ` `} ` |

*chevron_right*

*filter_none*

**Output:**

3

**Time Complexity: ** O(n)

**Auxiliary Space: ** O(n)

## Recommended Posts:

- Longest Palindromic Substring | Set 2
- Longest substring of vowels
- Longest Common Substring | DP-29
- Longest Non-palindromic substring
- Longest Palindromic Substring | Set 1
- Length of the longest valid substring
- Print the longest common substring
- Longest Even Length Substring such that Sum of First and Second Half is same
- Longest substring having K distinct vowels
- Longest repeating and non-overlapping substring
- Length of the longest substring with equal 1s and 0s
- Length of the longest substring without repeating characters
- Longest substring of 0s in a string formed by k concatenations
- Print Longest substring without repeating characters
- Longest Common Substring in an Array of Strings

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.