Find all K length subarrays containing only 1s in given Binary String
Given a binary string str[], the task is to find all possible K length subarrays containing only 1s and print their starting and ending index.
Examples:
Input: str = “0101000”, K=1
Output:
1 1
3 3
Explanation: Substrings at positions 1 and 3 are the substrings with value 1.
Input: str = “11111001”, K=3
Output:
0 2
1 3
2 4
Approach: The given problem can be solved with the help of the Sliding Window technique. Create a window of size K initially with a count of 1s from range 0 to K-1. Then traverse the string from index 1 to N-1 and subtract the value of i-1 and add the value of i+K to the current count. If the current count is equal to K, print the value of i and i+k-1 as one of the possible subarrays. Follow the steps below to solve the problem:
- Initialize the variable cntOf1s as 0.
- Iterate over the range [0, K) using the variable i and perform the following tasks:
- If s[i] equals 1 then increase the value of cntOf1s by 1.
- If cntOf1s equals K then print the current substring as one of the answer.
- Iterate over the range [1, N) using the variable i and perform the following tasks:
- Reduce the value from the left and add from the right to the variable cntOf1s if the characters at that position are 1.
- If the value of cntOf1s equals K, then print the current substring as the answer.
Below is the implementation of the above approach.
C++
#include <bits/stdc++.h>
using namespace std;
void get(string s, int k)
{
int n = s.length();
int cntOf1s = 0;
for ( int i = 0; i < k; i++)
if (s[i] == '1' )
cntOf1s++;
if (cntOf1s == k)
cout << 0 << " " << k - 1 << endl;
for ( int i = 1; i < n; i++) {
cntOf1s = cntOf1s - (s[i - 1] - '0' )
+ (s[i + k - 1] - '0' );
if (cntOf1s == k)
cout << i << " " << i + k - 1 << endl;
}
}
int main()
{
string str = "0110101110" ;
int K = 2;
get(str, K);
return 0;
}
|
Java
import java.util.*;
class GFG{
static void get( char [] s, int k)
{
int n = s.length;
int cntOf1s = 0 ;
for ( int i = 0 ; i < k; i++)
if (s[i] == '1' )
cntOf1s++;
if (cntOf1s == k)
System.out.print( 0 + " " + (k - 1 )+ "\n" );
for ( int i = 1 ; i < n && (i + k - 1 )<n; i++) {
cntOf1s = cntOf1s - (s[i - 1 ] - '0' )
+ (s[i + k - 1 ] - '0' );
if (cntOf1s == k)
System.out.print(i+ " " + (i + k - 1 )+ "\n" );
}
}
public static void main(String[] args)
{
String str = "0110101110" ;
int K = 2 ;
get(str.toCharArray(), K);
}
}
|
Python3
def get(s, k):
n = len (s)
cntOf1s = 0
for i in range ( 0 , k):
if (s[i] = = '1' ):
cntOf1s + = 1
if (cntOf1s = = k):
print (f "{0} {k - 1}" )
for i in range ( 1 , n - k + 1 ):
cntOf1s = cntOf1s - ( ord (s[i - 1 ]) - ord ( '0' )) + \
( ord (s[i + k - 1 ]) - ord ( '0' ))
if (cntOf1s = = k):
print (f "{i} {i + k - 1}" )
if __name__ = = "__main__" :
str = "0110101110"
K = 2
get( str , K)
|
C#
using System;
class GFG
{
static void get ( char [] s, int k)
{
int n = s.Length;
int cntOf1s = 0;
for ( int i = 0; i < k; i++)
if (s[i] == '1' )
cntOf1s++;
if (cntOf1s == k)
Console.Write(0 + " " + (k - 1) + "\n" );
for ( int i = 1; i < n && (i + k - 1) < n; i++)
{
cntOf1s = cntOf1s - (s[i - 1] - '0' )
+ (s[i + k - 1] - '0' );
if (cntOf1s == k)
Console.Write(i + " " + (i + k - 1) + "\n" );
}
}
public static void Main()
{
String str = "0110101110" ;
int K = 2;
get (str.ToCharArray(), K);
}
}
|
Javascript
<script>
function get(s, k) {
let n = s.length;
let cntOf1s = 0;
for (let i = 0; i < k; i++)
if (s[i] == '1' )
cntOf1s++;
if (cntOf1s == k)
document.write(0 + ' ' + (k - 1) + '<br>' );
for (let i = 1; i < n; i++) {
cntOf1s = cntOf1s - (s[i - 1].charCodeAt(0) - '0' .charCodeAt(0))
+ (s[i + k - 1].charCodeAt(0) - '0' .charCodeAt(0));
if (cntOf1s == k)
document.write(i + ' ' + (i + k - 1) + '<br>' );
}
}
let str = "0110101110" ;
let K = 2;
get(str, K);
</script>
|
Time Complexity: O(N)
Auxiliary Space: O(1)
Last Updated :
29 Dec, 2021
Like Article
Save Article
Share your thoughts in the comments
Please Login to comment...