Compruebe si todas las substrings de longitud K de una string binaria tienen el mismo recuento de 0 y 1

Dada una string binaria S de longitud N y un entero par K , la tarea es comprobar si todas las substrings de longitud K contienen el mismo número de 0 s y 1 s. Si es cierto, escriba «Sí». De lo contrario, escriba “No”.

Ejemplos:

Entrada: S = “101010”, K = 2
Salida:
Explicación:
Dado que todas las substrings de longitud 2 tienen el mismo número de 0 y 1, la respuesta es Sí.

Entrada: S = «101011», K = 4
Salida: No
Explicación:
Dado que la substring «1011» tiene un recuento desigual de 0 y 1, la respuesta es No.

Enfoque ingenuo: el enfoque más simple para resolver el problema es generar todas las substrings de longitud K y verificar si contiene un recuento igual de 1 y 0 o no. 

Complejidad de Tiempo: O(N 2 )  
Espacio Auxiliar: O(1)

Enfoque eficiente: la observación principal para optimizar el enfoque anterior es que, para que la string S tenga un recuento igual de 0 y 1 en substrings de longitud K , S[i] debe ser igual a S[i + k] . Siga los pasos a continuación para resolver el problema:

  • Recorra la string y para cada i -ésimo carácter, verifique si S[i] = S[j] donde (i == (j % k))
  • Si se encuentra que es falso en cualquier momento, escriba «No».
  • De lo contrario, verifique la primera substring de longitud K y si contiene un recuento igual de 1 y 0 o no. Si se encuentra que es cierto, escriba «Sí». De lo contrario, escriba “No”.

A continuación se muestra la implementación del enfoque anterior:

C++

// C++ program for the above approach
#include <iostream>
using namespace std;
 
// Function to check if the substring
// of length K has equal 0 and 1
int check(string& s, int k)
{
    int n = s.size();
 
    // Traverse the string
    for (int i = 0; i < k; i++) {
        for (int j = i; j < n; j += k) {
 
            // Check if every K-th character
            // is the same or not
            if (s[i] != s[j])
                return false;
        }
    }
    int c = 0;
 
    // Traverse substring of length K
    for (int i = 0; i < k; i++) {
 
        // If current character is 0
        if (s[i] == '0')
 
            // Increment count
            c++;
 
        // Otherwise
        else
 
            // Decrement count
            c--;
    }
 
    // Check for equal 0s and 1s
    if (c == 0)
        return true;
    else
        return false;
}
 
// Driver code
int main()
{
    string s = "101010";
    int k = 2;
 
    if (check(s, k))
        cout << "Yes" << endl;
    else
        cout << "No" << endl;
 
    return 0;
}

Java

// Java program for
// the above approach
import java.util.*;
class GFG{
 
// Function to check if the substring
// of length K has equal 0 and 1
static boolean check(String s, int k)
{
  int n = s.length();
 
  // Traverse the String
  for (int i = 0; i < k; i++)
  {
    for (int j = i; j < n; j += k)
    {
      // Check if every K-th character
      // is the same or not
      if (s.charAt(i) != s.charAt(j))
        return false;
    }
  }
  int c = 0;
 
  // Traverse subString of length K
  for (int i = 0; i < k; i++)
  {
    // If current character is 0
    if (s.charAt(i) == '0')
 
      // Increment count
      c++;
 
    // Otherwise
    else
 
      // Decrement count
      c--;
  }
 
  // Check for equal 0s and 1s
  if (c == 0)
    return true;
  else
    return false;
}
 
// Driver code
public static void main(String[] args)
{
  String s = "101010";
  int k = 2;
 
  if (check(s, k))
    System.out.print("Yes" + "\n");
  else
    System.out.print("No" + "\n");
}
}
 
// This code is contributed by 29AjayKumar

Python3

# Python3 program for the above approach
  
# Function to check if the substring
# of length K has equal 0 and 1
def check(s, k):
     
    n = len(s)
  
    # Traverse the string
    for i in range(k):
        for j in range(i, n, k):
  
            # Check if every K-th character
            # is the same or not
            if (s[i] != s[j]):
                return False
                 
    c = 0
  
    # Traverse substring of length K
    for i in range(k):
  
        # If current character is 0
        if (s[i] == '0'):
  
            # Increment count
            c += 1
  
        # Otherwise
        else:
             
            # Decrement count
            c -= 1
             
    # Check for equal 0s and 1s
    if (c == 0):
        return True
    else:
        return False
 
# Driver code
s = "101010"
k = 2
  
if (check(s, k) != 0):
    print("Yes")
else:
    print("No")
  
# This code is contributed by sanjoy_62

C#

// C# program for
// the above approach
using System;
class GFG{
 
// Function to check if the substring
// of length K has equal 0 and 1
static bool check(String s, int k)
{
  int n = s.Length;
 
  // Traverse the String
  for (int i = 0; i < k; i++)
  {
    for (int j = i; j < n; j += k)
    {
      // Check if every K-th character
      // is the same or not
      if (s[i] != s[j])
        return false;
    }
  }
  int c = 0;
 
  // Traverse subString of length K
  for (int i = 0; i < k; i++)
  {
    // If current character is 0
    if (s[i] == '0')
 
      // Increment count
      c++;
 
    // Otherwise
    else
 
      // Decrement count
      c--;
  }
 
  // Check for equal 0s and 1s
  if (c == 0)
    return true;
  else
    return false;
}
 
// Driver code
public static void Main(String[] args)
{
  String s = "101010";
  int k = 2;
 
  if (check(s, k))
    Console.Write("Yes" + "\n");
  else
    Console.Write("No" + "\n");
}
}
 
// This code is contributed by Rajput-Ji

Javascript

<script>
// javascript program for the
// above approach
 
// Function to check if the substring
// of length K has equal 0 and 1
function check(s, k)
{
  let n = s.length;
  
  // Traverse the String
  for (let i = 0; i < k; i++)
  {
    for (let j = i; j < n; j += k)
    {
      // Check if every K-th character
      // is the same or not
      if (s[i] != s[j])
        return false;
    }
  }
  let c = 0;
  
  // Traverse subString of length K
  for (let i = 0; i < k; i++)
  {
    // If current character is 0
    if (s[i]== '0')
  
      // Increment count
      c++;
  
    // Otherwise
    else
  
      // Decrement count
      c--;
  }
  
  // Check for equal 0s and 1s
  if (c == 0)
    return true;
  else
    return false;
}
  
// Driver Code
 
     let s = "101010";
  let k = 2;
  
  if (check(s, k))
    document.write("Yes" + "<br/>");
  else
    document.write("No");
 
// This code is contributed by target_2.
</script>
Producción: 

Yes

 

Complejidad temporal: O(N)
Espacio auxiliar: O(1) 

Publicación traducida automáticamente

Artículo escrito por ayushnemmaniwar 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 *