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 occurring more number of times than 0.
Input : 101100
Output : 5
Substring 10110 has 1 occurring more number of times than 0.
A simple solution is to one by one consider all the substrings and check if that substring has a count of 1 more than 0. If the count is more than comparing its length with maximum length substring found till now. The time complexity of this solution is O(n^2).
An efficient solution is to use hashing. The idea is to find the sum of string traversed until now. Add 1 to the result if the current character is ‘1’ else subtract 1. Now the problem reduces to finding the largest subarray having a sum greater than zero. To find the largest subarray having a sum greater than zero, we check the value of the sum. If sum is greater than zero, then the largest subarray with a sum greater than zero is arr[0..i].
If the sum is less than zero, then find the size of subarray arr[j+1..i], where j is index up to 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 a 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 the length of largest subarray and that is obtained from first index occurrence.
Steps to solve this problem:
1. Declare n=bin.length ,i,sum=0.
2. Declare unordered map prevSum of key and value integer type.
3. Declare variables maxlen=0,currlen.
4. Iterate through i=0 till n:
*Check if bin[i]=1 than sum++ else sum–.
*Check if sum is greater than zero than maxlen=i+1.
*Else check if sum is smaller than equal to zero and sum-1 is present in prevSum than current=i-prevSum[sum-1] and maxlen=max(maxlen,currlen).
*Check if sum is not present in prevSum than prevSum[sum]=i.
5. Return maxlen.
Below is the implementation of above approach:
C++
#include <bits/stdc++.h>
using namespace std;
int findLongestSub(string bin)
{
int n = bin.length(), i;
int sum = 0;
unordered_map< int , int > prevSum;
int maxlen = 0;
int currlen;
for (i = 0; i < n; i++) {
if (bin[i] == '1' )
sum++;
else
sum--;
if (sum > 0) {
maxlen = i + 1;
}
else if (sum <= 0) {
if (prevSum.find(sum - 1) != prevSum.end()) {
currlen = i - prevSum[sum - 1];
maxlen = max(maxlen, currlen);
}
}
if (prevSum.find(sum) == prevSum.end())
prevSum[sum] = i;
}
return maxlen;
}
int main()
{
string bin = "1010" ;
cout << findLongestSub(bin);
return 0;
}
|
Java
import java.util.HashMap;
class GFG
{
static int findLongestSub(String bin)
{
int n = bin.length(), i;
int sum = 0 ;
HashMap<Integer,
Integer> prevSum = new HashMap<>();
int maxlen = 0 ;
int currlen;
for (i = 0 ; i < n; i++)
{
if (bin.charAt(i) == '1' )
sum++;
else
sum--;
if (sum > 0 )
{
maxlen = i + 1 ;
}
else if (sum <= 0 )
{
if (prevSum.containsKey(sum - 1 ))
{
currlen = i - (prevSum.get(sum - 1 ) == null ? 1 :
prevSum.get(sum - 1 ));
maxlen = Math.max(maxlen, currlen);
}
}
if (!prevSum.containsKey(sum))
prevSum.put(sum, i);
}
return maxlen;
}
public static void main(String[] args)
{
String bin = "1010" ;
System.out.println(findLongestSub(bin));
}
}
|
Python3
def findLongestSub(bin1):
n = len (bin1)
sum = 0
prevSum = {i: 0 for i in range (n)}
maxlen = 0
for i in range (n):
if (bin1[i] = = '1' ):
sum + = 1
else :
sum - = 1
if ( sum > 0 ):
maxlen = i + 1
elif ( sum < = 0 ):
if (( sum - 1 ) in prevSum):
currlen = i - prevSum[ sum - 1 ]
maxlen = max (maxlen, currlen)
if (( sum ) not in prevSum):
prevSum[ sum ] = i
return maxlen
if __name__ = = '__main__' :
bin1 = "1010"
print (findLongestSub(bin1))
|
C#
using System;
using System.Collections.Generic;
class GFG
{
static int findLongestSub(String bin)
{
int n = bin.Length, i;
int sum = 0;
Dictionary< int ,
int > prevSum = new Dictionary< int ,
int >();
int maxlen = 0;
int currlen;
for (i = 0; i < n; i++)
{
if (bin[i] == '1' )
sum++;
else
sum--;
if (sum > 0)
{
maxlen = i + 1;
}
else if (sum <= 0)
{
if (prevSum.ContainsKey(sum - 1))
{
currlen = i - (prevSum[sum - 1] == 0 ? 1 :
prevSum[sum - 1]);
maxlen = Math.Max(maxlen, currlen);
}
}
if (!prevSum.ContainsKey(sum))
prevSum.Add(sum, i);
}
return maxlen;
}
public static void Main(String[] args)
{
String bin = "1010" ;
Console.WriteLine(findLongestSub(bin));
}
}
|
Javascript
<script>
function findLongestSub(bin)
{
let n = bin.length, i;
let sum = 0;
let prevSum = new Map();
let maxlen = 0;
let currlen;
for (i = 0; i < n; i++)
{
if (bin[i] == '1' )
sum++;
else
sum--;
if (sum > 0)
{
maxlen = i + 1;
}
else if (sum <= 0)
{
if (prevSum.has(sum - 1))
{
currlen = i - (prevSum.get(sum - 1) == null ? 1 :
prevSum.get(sum - 1));
maxlen = Math.max(maxlen, currlen);
}
}
if (!prevSum.has(sum))
prevSum.set(sum, i);
}
return maxlen;
}
let bin = "1010" ;
document.write(findLongestSub(bin));
</script>
|
complexity Analysis:
- Time Complexity: O(n)
- Auxiliary Space: O(n)
Last Updated :
14 Feb, 2023
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...