Comprobar si una string binaria contiene todas las permutaciones de longitud k

Dada una string binaria y k, para verificar si contiene todas las permutaciones de longitud k o no. 

Ejemplos: 

Input : Binary string 11001
        k : 2
Output : Yes
11001 contains all possibilities of 
binary sequences with k = 2, 00, 01, 
10, 11

Input : Binary string: 1001
        k : 2
Output: No
1001 does not contain all possibilities of
binary sequences with k = 2. Here 11 
sequence is missing

Método 1: 
Explicación: 
En este ejemplo, no se encuentra una secuencia binaria de longitud k, es 0110.
Entonces, todas las secuencias binarias con k=4 serán 2 4 =16. están siguiendo 
0000, 0001, 0010, 0011, 0100, 0101, 0110, 0111, 
1000, 1001, 1010, 1011, 1100, 1101, 1110, 1111 
Todo debe ser una substring de una string binaria dada y luego imprimir Sí de lo contrario No

Algoritmo 
Tomando string binaria y el tamaño k. En la string binaria, verificamos que las secuencias binarias coincidan o no. La secuencia binaria está hecha de tamaño k, ya que sabemos que en binario usa 0 y 1 dígito, por lo que generar subconjuntos binarios totales es 2 k elementos. La idea principal detrás de esto es almacenar todos los valores binarios en la lista como una string y luego comparar la lista de todos los elementos con la string binaria dada como subconjunto. Si todo ocurre dentro de la string binaria, imprima «Sí», de lo contrario, imprima «No». 

Java

// Java program to Check a binary string
// contains all permutations of length k.
 
import java.util.*;
public class Checkbinary {
 
    // to check all Permutation in given String
    public static boolean tocheck(String s, int k)
    {
        List<String> list = BinarySubsets(k);
 
        // to check binary sequences are available
        // in string or not
        for (String b : list)
            if (s.indexOf(b) == -1)
                return false;       
 
        return true;
    }
 
    // to generate all binary subsets of given length k
    public static List<String> BinarySubsets(int k)
    {
        // Declare the list as String
        List<String> list = new ArrayList<>();
 
        // to define the format of binary of
        // given length k
        String format = "%0" + k + "d";
 
        // returns the string representation of the
        // unsigned integer value represented by
        // the argument in binary (base 2)  using
        // Integer.toBinaryString and convert it
        // into integer using Integer.valueOf.
        // Loop for 2<sup>k</sup> elements
        for (int i = 0; i < Math.pow(2, k); i++)
        {
            // To add in the list all possible
            // binary sequence of given length
            list.add(String.format(format,
                Integer.valueOf(Integer.toBinaryString(i))));
 
            /* To Show all binary sequence of given
               length k
            System.out.println(String.format(format,
            Integer.valueOf(Integer.toBinaryString(i))));*/
        }
        return list;
    }
 
    // drive main
    public static void main(String[] args)
    {
        String str = "11001";
        int num = 2;
        if (tocheck(str, num))
            System.out.println("Yes");
        else
            System.out.println("No");
    }
}
Producción

Yes

Método 2: 

Algoritmo 
Tomando string binaria y el tamaño k. En la string binaria, verificamos que las secuencias binarias coincidan o no. La secuencia binaria está hecha de tamaño k, ya que sabemos que en binario usa 0 y 1 dígito, por lo que generar subconjuntos binarios totales es 2 k elementos. La idea principal detrás de esto es almacenar toda la substring de tamaño k de la string dada en el conjunto, es decir, almacenar la substring distinta de tamaño k. Si el tamaño del conjunto es igual a 2 k , escriba «SÍ», de lo contrario, escriba «NO».

C++14

// C++ Program to Check If a
// String Contains All Binary
// Codes of Size K
#include <bits/stdc++.h>
using namespace std;
#define int long long
 
bool hasAllcodes(string s, int k)
{
     
    // Unordered map of type string
    unordered_set<string> us;
   
    for (int i = 0; i + k <= s.size(); i++)
    {
        us.insert(s.substr(i, k));
    }
    return us.size() == 1 << k;
}
 
// Driver Code
signed main()
{
    string s = "00110110";
    int k = 2;
    if (hasAllcodes)
    {
        cout << "YES\n";
    }
    else
    {
        cout << "NO\n";
    }
}

Java

// Java Program to Check If a
// String Contains All Binary
// Codes of Size K
import java.io.*;
import java.util.*;
class GFG
{
    static boolean hasAllcodes(String s, int k)
    {
       
        // Unordered map of type string
        Set<String> us= new HashSet<String>();
        for(int i = 0; i + k <= s.length(); i++)
        {
            us.add(s.substring(i, i + k));
        }
        return (us.size() == (1 << k));
    }
   
    // Driver code
    public static void main (String[] args)
    {
        String s = "00110110";
        int k = 2;
        if(hasAllcodes(s, k))
        {
            System.out.println("YES");
        }
        else
        {
            System.out.println("NO");
        }
    }
}
 
//  This code is contributed by avanitrachhadiya2155

Python3

# Python3 Program to Check If a
# String Contains All Binary
# Codes of Size K
def hasAllcodes(s, k) :
     
    # Unordered map of type string
    us = set()
    for i in range(len(s) + 1) :   
        us.add(s[i : k])   
    return len(us) == 1 << k
 
# Driver code
s = "00110110"
k = 2
if (hasAllcodes) :
    print("YES")
else :
    print("NO")
 
    # This code is contributed by divyeshrabadiya07

C#

// C# Program to Check If a
// String Contains All Binary
// Codes of Size K
using System;
using System.Collections.Generic;
class GFG {
 
  static bool hasAllcodes(string s, int k)
  {
 
    // Unordered map of type string
    HashSet<string> us = new HashSet<string>();
 
    for (int i = 0; i + k <= s.Length; i++)
    {
      us.Add(s.Substring(i, k));
    }
 
    return us.Count == 1 << k;
  }
 
  // Driver code
  static void Main()
  {
    string s = "00110110";
    int k = 2;
    if(hasAllcodes(s, k))
    {
      Console.WriteLine("YES");
    }
    else
    {
      Console.WriteLine("NO");
    }
  }
}
 
// This code is contributed by divyesh072019

Javascript

<script>
 
// Javascript program to Check If a
// String Contains All Binary
// Codes of Size K
function hasAllcodes(s,k)
{
     
    // Unordered map of type string
    let us = new Set();
    for(let i = 0; i + k <= s.length; i++)
    {
        us.add(s.substring(i, i + k));
    }
    return (us.size == (1 << k));
}
 
// Driver code
let s = "00110110";
let k = 2;   
 
if (hasAllcodes(s, k))
{
    document.write("YES");
}
else
{
    document.write("NO");
}
 
// This code is contributed by ab2127
 
</script>
Producción

YES

 Método: 3 (basado en dos punteros)

En este método, tomaremos una ventana de tamaño k y moveremos esa ventana hasta el final, y marcaremos todas las permutaciones posibles en la array visitada. luego verifique si hay algún valor que no esté marcado como visitado y luego devuelva falso, de lo contrario, devuelva verdadero.

C++

#include <bits/stdc++.h>
using namespace std;
 
bool hasAllCodes(string s, int k)
{
    int n = s.size();
    if (n < k)
        return false;
    int size = pow(2, k);
    vector<bool> visited(size, false);
    int i = 0;
    int j = 0;
    int val = 0;
    while (j < k - 1) {
        val = 2 * val + (s[j] - '0');
        j++;
    }
    while (j < n) {
        val = 2 * val + (s[j] - '0');
        visited[val] = true;
        if (s[i] == '1')
            val -= pow(2, k - 1);
        j++;
        i++;
    }
    for (int i = 0; i < size; i++) {
        if (!visited[i])
            return false;
    }
    return true;
}
// Driver Code
int main()
{
    string s = "00110110";
    int k = 2;
    if (hasAllCodes(s, k)) {
        cout << "YES\n";
    }
    else {
        cout << "NO\n";
    }
}

Java

// Java program to implement the approach
import java.util.*;
 
class GFG {
 
  // Method to check if the string contnains
  // all the binary codes of size k
  static boolean hasAllCodes(String s, int k)
  {
    int n = s.length();
    if (n < k)
      return false;
    int size = (int)Math.pow(2, k);
 
    // ArrayList that tracks if a certain code
    // has been found
    ArrayList<Boolean> visited
      = new ArrayList<Boolean>();
    for (int i = 0; i < size; i++)
      visited.add(false);
 
    int i = 0;
    int j = 0;
    int val = 0;
    while (j < k - 1) {
      val = 2 * val + (s.charAt(j) - '0');
      j++;
    }
    while (j < n) {
      val = 2 * val + (s.charAt(j) - '0');
      visited.set(val, true);
      if (s.charAt(i) == '1')
        val -= (int)Math.pow(2, k - 1);
      j++;
      i++;
    }
 
    // Checking if all the codes have been found
    for (i = 0; i < size; i++) {
      if (!visited.get(i))
        return false;
    }
    return true;
  }
 
  // Driver Code
  public static void main(String[] args)
  {
 
    String s = "00110110";
    int k = 2;
 
    // Function call
    if (hasAllCodes(s, k)) {
      System.out.print("YES\n");
    }
    else {
      System.out.print("NO\n");
    }
  }
}
 
// This code is contributed by phasing17

Python3

# Python3 Program to Check If a String Contains All Binary Codes of Size K
def hasAllcodes(s, k):
    n = s.len()
    size = pow(2, k)
    visited = [True for i in range(size)]
    i = 0
    j = 0
    val = 0
    while(j < k-1):
        val = (2 * val) + (s[j] - '0')
        j += 1
    while(j < size):
        val = (2 * val) + (s[j] - '0')
        visited[val] = True
        if(s[i] == '1'):
            val = val - pow(2,k-1)
        j += 1
        i += 1
    for i in range(size):
        if(visited[i] == False):
            return False
    return True
 
 # Driver code
s = "00110110"
k = 2
if (hasAllcodes):
    print("YES")
else:
    print("NO")
     
# This code is contributed by Ajay Makvana

Javascript

// JavaScript Program to Check If a String Contains All Binary Codes of Size K
function hasAllcodes(s, k)
{
    var n = s.length;
    var size = Math.pow(2, k);
    var visited = new Array(size).fill(true);
    var i = 0;
    var j = 0;
    var val = 0;
    while (j < k-1)
    {
        val = (2 * val) + (s[j] - '0');
        j += 1;
    }
    while (j < size)
    {
        val = (2 * val) + (s[j] - '0');
        visited[val] = true;
        if(s[i] == '1')
            val = val - Math.pow(2, k - 1);
        j += 1;
        i += 1;
    }
     
    for (var i = 0; i < size; i++)
    {
        if(visited[i] == false)
            return false;
    }
    return true;
}
 
// Driver code
var s = "00110110";
var k = 2;
if (hasAllcodes)
    console.log("YES");
else
    console.log("NO");
     
// This code is contributed by phasing17
Producción

YES
Time Complexity : O(n)

Publicación traducida automáticamente

Artículo escrito por Mithun Kumar y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *