Open In App

Find all K length subarrays containing only 1s in given Binary String

Last Updated : 29 Dec, 2021
Comments
Improve
Suggest changes
Like Article
Like
Report

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++
// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;

// Function to find all possible
// k length subarrays
void get(string s, int k)
{
    int n = s.length();

    int cntOf1s = 0;

    // Initial window
    for (int i = 0; i < k; i++)
        if (s[i] == '1')
            cntOf1s++;

    if (cntOf1s == k)
        cout << 0 << " " << k - 1 << endl;

    // Traverse the string
    for (int i = 1; i < n; i++) {

        // Subtract the value from the left and
        // add from the right
        cntOf1s = cntOf1s - (s[i - 1] - '0')
                  + (s[i + k - 1] - '0');

        // Check the condition
        if (cntOf1s == k)
            cout << i << " " << i + k - 1 << endl;
    }
}

// Driver Code
int main()
{
    string str = "0110101110";
    int K = 2;
    get(str, K);
    return 0;
}
Java
// Java program for the above approach
import java.util.*;
class GFG{

// Function to find all possible
// k length subarrays
static void get(char[] s, int k)
{
    int n = s.length;

    int cntOf1s = 0;

    // Initial window
    for (int i = 0; i < k; i++)
        if (s[i] == '1')
            cntOf1s++;

    if (cntOf1s == k)
        System.out.print(0+ " " +  (k - 1 )+"\n");

    // Traverse the String
    for (int i = 1; i < n && (i + k - 1)<n; i++) {

        // Subtract the value from the left and
        // add from the right
        cntOf1s = cntOf1s - (s[i - 1] - '0')
                  + (s[i + k - 1] - '0');

        // Check the condition
        if (cntOf1s == k)
            System.out.print(i+ " " +  (i + k - 1 )+"\n");
    }
}

// Driver Code
public static void main(String[] args)
{
    String str = "0110101110";
    int K = 2;
    get(str.toCharArray(), K);
}
}

// This code is contributed by 29AjayKumar 
Python3
# python3 program for the above approach

# Function to find all possible
# k length subarrays
def get(s, k):

    n = len(s)
    cntOf1s = 0

    # Initial window
    for i in range(0, k):
        if (s[i] == '1'):
            cntOf1s += 1

    if (cntOf1s == k):
        print(f"{0} {k - 1}")

    # Traverse the string
    for i in range(1, n - k + 1):

        # Subtract the value from the left and
        # add from the right
        cntOf1s = cntOf1s - (ord(s[i - 1]) - ord('0')) + \
            (ord(s[i + k - 1]) - ord('0'))

        # Check the condition
        if (cntOf1s == k):
            print(f"{i} {i + k - 1}")

# Driver Code
if __name__ == "__main__":

    str = "0110101110"
    K = 2
    get(str, K)

# This code is contributed by rakeshsahni
C#
// C# program for the above approach
using System;
class GFG
{

  // Function to find all possible
  // k length subarrays
  static void get(char[] s, int k)
  {
    int n = s.Length;

    int cntOf1s = 0;

    // Initial window
    for (int i = 0; i < k; i++)
      if (s[i] == '1')
        cntOf1s++;

    if (cntOf1s == k)
      Console.Write(0 + " " + (k - 1) + "\n");

    // Traverse the String
    for (int i = 1; i < n && (i + k - 1) < n; i++)
    {

      // Subtract the value from the left and
      // add from the right
      cntOf1s = cntOf1s - (s[i - 1] - '0')
        + (s[i + k - 1] - '0');

      // Check the condition
      if (cntOf1s == k)
        Console.Write(i + " " + (i + k - 1) + "\n");
    }
  }

  // Driver Code
  public static void Main()
  {
    String str = "0110101110";
    int K = 2;
    get(str.ToCharArray(), K);
  }
}

// This code is contributed by Saurabh Jaiswal
JavaScript
  <script>
        // JavaScript code for the above approach

        // Function to find all possible
        // k length subarrays
        function get(s, k) {
            let n = s.length;

            let cntOf1s = 0;

            // Initial window
            for (let i = 0; i < k; i++)
                if (s[i] == '1')
                    cntOf1s++;

            if (cntOf1s == k)
                document.write(0 + ' ' + (k - 1) + '<br>');

            // Traverse the string
            for (let i = 1; i < n; i++) {

                // Subtract the value from the left and
                // add from the right
                cntOf1s = cntOf1s - (s[i - 1].charCodeAt(0) - '0'.charCodeAt(0))
                    + (s[i + k - 1].charCodeAt(0) - '0'.charCodeAt(0));

                // Check the condition
                if (cntOf1s == k)
                    document.write(i + ' ' + (i + k - 1) + '<br>');
            }
        }

        // Driver Code
        let str = "0110101110";

        let K = 2;
        get(str, K);

  // This code is contributed by Potta Lokesh
    </script>

 
 


Output
1 2
6 7
7 8


 

Time Complexity: O(N)
Auxiliary Space: O(1)


 


Next Article
Practice Tags :

Similar Reads