Give binary string str and an integer N, the task is to check if the substrings of the string contain all binary representations of non-negative integers less than or equal to the given integer N.
Examples:
Input: str = “0110″, N = 3
Output: True
Explanation:
Since substrings “0″, “1″, “10″, and “11″ can be formed from given string. Hence all binary representations of 0 to 3 are present as substrings in given binary string.Input: str = “0110”, N = 4
Output: False
Explanation:
Since substrings “0″, “1″, “10″, and “11″ can be formed from given string, but not “100”. Hence the answer is False
Approach:
The above problem can be solved using BitSet and HashMap. Follow the steps given below to solve the problem
- Initialize a map[] to mark the strings and take a bit-set variable ans to convert the number from decimal to binary.
- Take one more variable count as zero.
- run the loop from N to 1 using the variable i and check the corresponding numbers are marked in a map or not.
- if number i is not marked in a map[] then convert the current number into binary using the bit-set variable ans.
- then check if converted binary string is substring of the given string or not.
- if it is not a substring then
- run while loop unless i is not marked and binary number becomes zero
- mark the i in a map
- increment the count
- do the right shift of converted number. This is done because if any string x is converted into binary (say 111001) and this substring is already marked in map, then 11100 will already be marked automatically.
This is based on the fact that if i exists, i>>1 also exists.
- Finally check if count ? N + 1, then print True
Else print False
Below is the implementation of above approach:
C++
// C++ program for the above approach #include <bits/stdc++.h> using namespace std; // Function to convert decimal to binary // representation string decimalToBinary( int N) { string ans = "" ; // Iterate over all bits of N while (N > 0) { // If bit is 1 if (N & 1) { ans = '1' + ans; } else { ans = '0' + ans; } N /= 2; } // Return binary representation return ans; } // Function to check if binary conversion // of numbers from N to 1 exists in the // string as a substring or not string checkBinaryString(string& str, int N) { // To store the count of number // exists as a substring int map[N + 10], cnt = 0; memset (map, 0, sizeof (map)); // Traverse from N to 1 for ( int i = N; i > 0; i--) { // If current number is not // present in map if (!map[i]) { // Store current number int t = i; // Find binary of t string s = decimalToBinary(t); // If the string s is a // substring of str if (str.find(s) != str.npos) { while (t && !map[t]) { // Mark t as true map[t] = 1; // Increment the count cnt++; // Update for t/2 t >>= 1; } } } } // Special judgement '0' for ( int i = 0; i < str.length(); i++) { if (str[i] == '0' ) { cnt++; break ; } } // If the count is N+1, return "yes" if (cnt == N + 1) return "True" ; else return "False" ; } // Driver Code int main() { // Given String string str = "0110" ; // Given Number int N = 3; // Function Call cout << checkBinaryString(str, N); return 0; } |
Java
// Java program for the above approach import java.util.*; class GFG{ // Function to convert decimal to binary // representation static String decimalToBinary( int N) { String ans = "" ; // Iterate over all bits of N while (N > 0 ) { // If bit is 1 if (N % 2 == 1 ) { ans = '1' + ans; } else { ans = '0' + ans; } N /= 2 ; } // Return binary representation return ans; } // Function to check if binary conversion // of numbers from N to 1 exists in the // String as a subString or not static String checkBinaryString(String str, int N) { // To store the count of number // exists as a subString int []map = new int [N + 10 ]; int cnt = 0 ; // Traverse from N to 1 for ( int i = N; i > 0 ; i--) { // If current number is not // present in map if (map[i] == 0 ) { // Store current number int t = i; // Find binary of t String s = decimalToBinary(t); // If the String s is a // subString of str if (str.contains(s)) { while (t > 0 && map[t] == 0 ) { // Mark t as true map[t] = 1 ; // Increment the count cnt++; // Update for t/2 t >>= 1 ; } } } } // Special judgement '0' for ( int i = 0 ; i < str.length(); i++) { if (str.charAt(i) == '0' ) { cnt++; break ; } } // If the count is N+1, return "yes" if (cnt == N + 1 ) return "True" ; else return "False" ; } // Driver Code public static void main(String[] args) { // Given String String str = "0110" ; // Given number int N = 3 ; // Function call System.out.print(checkBinaryString(str, N)); } } // This code is contributed by 29AjayKumar |
Python3
# Python3 implementation of # the above approach # Function to convert decimal to # binary representation def decimalToBinary(N): ans = "" # Iterate over all bits of N while (N > 0 ): # If bit is 1 if (N & 1 ): ans = '1' + ans else : ans = '0' + ans N / / = 2 # Return binary representation return ans # Function to check if binary conversion # of numbers from N to 1 exists in the # string as a substring or not def checkBinaryString( str , N): # To store the count of number # exists as a substring map = [ 0 ] * (N + 10 ) cnt = 0 # Traverse from N to 1 for i in range (N, - 1 , - 1 ): # If current number is not # present in map if ( not map [i]): # Store current number t = i # Find binary of t s = decimalToBinary(t) # If the string s is a # substring of str if (s in str ): while (t and not map [t]): # Mark t as true map [t] = 1 # Increment the count cnt + = 1 # Update for t/2 t >> = 1 # Special judgement '0' for i in range ( len ( str )): if ( str [i] = = '0' ): cnt + = 1 break # If the count is N+1, return "yes" if (cnt = = N + 1 ): return "True" else : return "False" # Driver Code if __name__ = = '__main__' : # Given String str = "0110" # Given Number N = 3 # Function Call print (checkBinaryString( str , N)) # This code is contributed by Shivam Singh |
C#
// C# program for the above approach using System; class GFG{ // Function to convert decimal to binary // representation static String decimalToBinary( int N) { String ans = "" ; // Iterate over all bits of N while (N > 0) { // If bit is 1 if (N % 2 == 1) { ans = '1' + ans; } else { ans = '0' + ans; } N /= 2; } // Return binary representation return ans; } // Function to check if binary conversion // of numbers from N to 1 exists in the // String as a subString or not static String checkBinaryString(String str, int N) { // To store the count of number // exists as a subString int []map = new int [N + 10]; int cnt = 0; // Traverse from N to 1 for ( int i = N; i > 0; i--) { // If current number is not // present in map if (map[i] == 0) { // Store current number int t = i; // Find binary of t String s = decimalToBinary(t); // If the String s is a // subString of str if (str.Contains(s)) { while (t > 0 && map[t] == 0) { // Mark t as true map[t] = 1; // Increment the count cnt++; // Update for t/2 t >>= 1; } } } } // Special judgement '0' for ( int i = 0; i < str.Length; i++) { if (str[i] == '0' ) { cnt++; break ; } } // If the count is N+1, return "yes" if (cnt == N + 1) return "True" ; else return "False" ; } // Driver Code public static void Main(String[] args) { // Given String String str = "0110" ; // Given number int N = 3; // Function call Console.Write(checkBinaryString(str, N)); } } // This code is contributed by PrinciRaj1992 |
Javascript
<script> // Javascript program for the above approach // Function to convert decimal to binary // representation function decimalToBinary(N) { var ans = "" ; // Iterate over all bits of N while (N > 0) { // If bit is 1 if (N % 2 == 1){ ans = '1' + ans; } else { ans = '0' + ans; } N = parseInt(N/2); } // Return binary representation return ans; } // Function to check if binary conversion // of numbers from N to 1 exists in the // string as a substring or not function checkBinaryString(str, N) { // To store the count of number // exists as a substring var map = Array(N+10).fill(0), cnt = 0; // Traverse from N to 1 for ( var i = N; i > 0; i--) { // If current number is not // present in map if (!map[i]) { // Store current number var t = i; // Find binary of t var s = decimalToBinary(t); // If the string s is a // substring of str if (str.includes(s)) { while (t>0 && map[t] == 0) { // Mark t as true map[t] = 1; // Increment the count cnt++; // Update for t/2 t >>= 1; } } } } // Special judgement '0' for ( var i = 0; i < str.length; i++) { if (str[i] == '0' ) { cnt++; break ; } } // If the count is N+1, return "yes" if (cnt == N + 1) return "True" ; else return "False" ; } // Driver Code // Given String var str = "0110" ; // Given Number var N = 3; // Function Call document.write( checkBinaryString(str, N)); </script> |
True
Time Complexity: O(N logN)
Auxiliary Space: O(N), as extra space of size N is used to make an array
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!