Encuentre todas las substrings con incluso 1 cuyo reverso también esté presente en la String dada

Dada una string binaria str . La tarea es encontrar el tamaño del conjunto (contiene substrings únicas) de substrings tales que si hay una substring (supongamos que A ) de longitud n con un número par de 1 y también hay otra substring (supongamos que B ) del mismo longitud n y un número par de 1 y es inverso a A , entonces solo se consideraría A en el conjunto de strings.

Ejemplos:

Entrada: str = «10101»
Salida: 8
Explicación: Todas las substrings únicas de la string dada = {1, 0, 10, 01, 101, 010, 1010, 0101, 10101}. 
En el conjunto anterior (1010, 0101) sigue la propiedad especial. 
Por lo tanto, solo se considerarán 1010 en el conjunto dado. 
Conjunto actualizado = A = {1, 0, 10, 01, 101, 010, 1010, 10101}.
Longitud de A=8

Entrada: str = «10001»
Salida: 11
Explicación: Todas las substrings únicas de la string dada = {1, 0, 10, 01, 00, 100, 000, 001, 1000, 0001, 10001}. 
En el conjunto anterior, ninguna string sigue a la propiedad especial. Longitud del conjunto = 11

 

Enfoque: siga estas dos reglas particulares para resolver el problema:

  • Todas las strings en pares que no sigan una propiedad especial deben identificarse de forma única.
  • Todas las strings en pares que siguen a una propiedad especial deben identificarse como una sola.

Entonces, para resolver este problema, use un conjunto de Lista de enteros donde cada lista contendría tres variables: {longitud, par, impar} . Además, use una variable de conteo que describa el conteo de 1 en la substring . Aquí ‘longitud’ describirá la longitud de la substring. Las variables pares e impares se utilizan para describir el recuento de 1 como par o impar siempre que se encuentre ‘0’ en la substring. Después de eso, agréguelo al conjunto de substrings y luego imprima el tamaño del conjunto.

¿POR QUÉ FUNCIONA ESTO?

Considere una string binaria con un número par de 1 y cada vez que se encuentre 0 en ella, vea cuántos 1 aparecen antes de ese 0 y, si es par, aumente el recuento de variables pares; de lo contrario, aumente el recuento de variables impares.

Supongamos que, cuando se encuentra 0 en una substring y hasta que tiene 1 pares, el resto también sería 1 (porque hemos considerado una string con 1 pares), de manera similar, si tenemos 1 impares hasta que encontremos 0, por lo tanto, el resto también sería 1 impar. Por lo tanto, la string inversa tendría la misma paridad (es decir, la cuenta de 1 como par o impar). Es por eso que no tomaría en consideración la string inversa.

Siga los pasos a continuación para resolver el problema:

  • Inicialice el HashSet s[].
  • Iterar sobre el rango [0, str.length()) usando la variable i y realizar las siguientes tareas:
    • Inicialice el recuento de variables, pares e impares como 0 .
    • Itere sobre el rango [0, a.length()) usando la variable j y realice las siguientes tareas:
      • Si str[j] es igual a 1 , aumente el valor de count en 1.
      • De lo contrario, si count%2 es igual a 0 , aumente el valor de par en 1 ; de lo contrario, el valor de impar en 1.
      • Inicialice la variable len como j-i+1.
      • Inicialice una nueva ArrayList x[].
      • Agregue los valores de {largo, par, impar} a ArrayList x[].
      • Agregue x[] al HashSet s[].
  • Después de realizar los pasos anteriores, imprima el valor del tamaño del conjunto como respuesta.

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

C++

// C++ code for the above approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to find number of substrings
// fulfilling the condition
void find(string a)
{
 
  // Initialize the hash-set
  set<vector<int>> s;
 
  // Traverse the string
  for (int i = 0; i < a.length(); i++)
  {
 
    // Initialize the variables
    int count = 0, even = 0, odd = 0;
    for (int j = i; j < a.length();
         j++)
    {
 
      // Check the condition
      if (a[j] == '1')
      {
        count++;
      }
      else
      {
        if (count % 2 == 0)
        {
          even++;
        }
        else
        {
          odd++;
        }
      }
      int len = j - i + 1;
      vector<int> x;
      x.push_back(len);
      x.push_back(even);
      x.push_back(odd);
      s.insert(x);
    }
  }
 
  // Print the result
  cout << (s.size());
}
 
// Driver Code
int main()
{
  string str = "10101";
  find(str);
  return 0;
}
 
// This code is contributed by Potta Lokesh

Java

// Java code to implement above approach
import java.io.*;
import java.util.*;
 
class GFG {
 
    // Function to find number of substrings
    // fulfilling the condition
    public static void find(String a)
    {
        // Initialize the hash-set
        HashSet<ArrayList<Integer> > s
            = new HashSet<>();
 
        // Traverse the string
        for (int i = 0; i < a.length(); i++) {
 
            // Initialize the variables
            int count = 0, even = 0, odd = 0;
            for (int j = i; j < a.length();
                 j++) {
 
                // Check the condition
                if (a.charAt(j) == '1') {
                    count++;
                }
                else {
                    if (count % 2 == 0) {
                        even++;
                    }
                    else {
                        odd++;
                    }
                }
                int len = j - i + 1;
                ArrayList<Integer> x
                    = new ArrayList<>();
                x.add(len);
                x.add(even);
                x.add(odd);
                s.add(x);
            }
        }
 
        // Print the result
        System.out.println(s.size());
    }
 
    // Driver Code
    public static void main(String[] args)
    {
        String str = "10101";
        find(str);
    }
}

Python3

# Python code to implement above approach
 
# Function to find number of substrings
# fulfilling the condition
def find(a):
   
    # Initialize the hash-set
    s = set();
 
    # Traverse the string
    for i in range(len(a)):
 
        # Initialize the variables
        count = 0; even = 0; odd = 0;
        for j in range(i,len(a)):
 
            # Check the condition
            if (a[j] == '1'):
                count += 1;
            else:
                if (count % 2 == 0):
                    even += 1;
                else:
                    odd += 1;
 
            length = j - i + 1;
            x = str(length)+str(even)+str(odd);
            s.add(x)
 
    # Print the result
    print(len(s));
 
# Driver Code
if __name__ == '__main__':
    string = "10101";
    find(string);
 
# This code is contributed by 29AjayKumar

C#

// C# code to implement above approach
using System;
using System.Collections;
using System.Collections.Generic;
 
public class GFG{
 
    // Function to find number of substrings
    // fulfilling the condition
    public static void find(String a)
    {
        // Initialize the hash-set
        HashSet<string> s = new HashSet<string>();
        string x;
        // Traverse the string
        for (int i = 0; i < a.Length; i++) {
 
            // Initialize the variables
            int count = 0, even = 0, odd = 0;
            for (int j = i; j < a.Length;
                 j++) {
 
                // Check the condition
                if (a[j] == '1') {
                    count++;
                }
                else {
                    if (count % 2 == 0) {
                        even++;
                    }
                    else {
                        odd++;
                    }
                }
                int len = j - i + 1;
                x = len.ToString() + even.ToString() +odd.ToString();
                s.Add(x);
            }
        }
 
        // Print the result
        Console.Write(s.Count);
    }
 
    // Driver Code
    public static void Main()
    {
        string str = "10101";
        find(str);
    }
}
 
// This code is contributed by Shubham Singh

Javascript

<script>
// Javascript code to implement above approach
 
// Function to find number of substrings
// fulfilling the condition
function find(a)
{
 
    // Initialize the hash-set
    let s = new Set();
    let x = "";
     
    // Traverse the string
    for (let i = 0; i < a.length; i++) {
 
        // Initialize the variables
        let count = 0, even = 0, odd = 0;
        for (let j = i; j < a.length;
            j++) {
 
            // Check the condition
            if (a[j] == '1') {
                count++;
            }
            else {
                if (count % 2 == 0) {
                    even++;
                }
                else {
                    odd++;
                }
            }
            let len = j - i + 1;
            x = len.toString() + even.toString() + odd.toString();
            s.add(x);
        }
    }
 
    // Print the result
    document.write(s.size);
}
 
// Driver Code
let str = "10101";
find(str);
 
// This code is contributed Saurabh Jaiswal
</script>
Producción: 

8

 

Complejidad de tiempo: O(N*N) donde N es la longitud de la string
Espacio auxiliar: O(N)

Publicación traducida automáticamente

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