Número mínimo de vueltas con rotación para alternar strings binarias

Dada una string binaria S de 0s y 1s . La tarea es convertir la string dada en una secuencia de caracteres alternativos mediante las siguientes operaciones:

  • Elimine algunos prefijos del principio y agréguelos al final.
  • Voltee algunos o todos los bits en la string dada.

Imprime el número mínimo de bits que se invertirán para que la string dada se alterné.

Ejemplos:

Entrada: S = «001»
Salida: 0
Explicación:
No es necesario voltear ningún elemento, podemos obtener una secuencia alterna usando la rotación a la izquierda: 010.

Entrada: S = “000001100”
Salida: 3
Explicación:
Siga los pasos para encontrar los giros mínimos para obtener una secuencia alterna:
1. Después de rotar la secuencia 6 veces hacia la izquierda, obtendremos: 100000001 
2. Ahora podemos aplicar la operación de volteo de la siguiente manera: 101000001 – > 101010001 -> 101010101
Por lo tanto, los giros mínimos para alternar strings son 3.

Enfoque ingenuo: El enfoque ingenuo consiste en tomar todas las N combinaciones posibles y calcular el número mínimo de bits para invertir en cada una de esas strings. Imprime el recuento mínimo entre todas esas combinaciones.
Complejidad de tiempo: O(N 2 ), donde N es la longitud de la string.
Espacio Auxiliar: O(N)

Enfoque eficiente: esto se puede resolver observando que la string final será del tipo «101010…» o «010101…» , de modo que todos los 1 estarán en posiciones pares o impares. Siga los pasos a continuación para resolver el problema:

  1. Cree una array de suma de prefijos donde pref[i] significa una cantidad de cambios necesarios hasta el índice i.
  2. Cree arrays de prefijos para los dos patrones anteriores.
  3. Verifique para cada i , si la substring [0, i] se agrega al final, cuántos caracteres se requieren voltear.
  4. Imprima el número mínimo de vueltas entre todas las substrings en los pasos anteriores.

¿Por qué solo las strings de longitud impar se consideran para la rotación y por qué la rotación no tendrá efecto en la string de longitud par? 

Intentaré explicar esto con el siguiente ejemplo,

Suponga que tiene la secuencia 011000 que tiene una longitud uniforme. Sin rotación, puede cambiarlo a 010101 o 101010. Ahora suponga que elige agregar 01 al final. La secuencia se convierte en 100001, que se puede cambiar a 010101 o 101010. Si compara cada carácter, verá que es el mismo caso que sin rotación. 1000 corresponde a 0101 o 1010 en ambos casos y 01 a 01 o 10.

Pero ahora considere un caso de longitud impar, 01100. Sin rotación, puede cambiarlo a 01010 o 10101. Ahora suponga que elige agregar 01 al final. La secuencia se convierte en 10001, que se puede cambiar a 01010 o 10101. Ahora, si compara cada carácter, verá que 100 corresponde a 010 o 101 en ambos casos, pero 01 corresponde a 01 cuando 100 es 010 en caso de que no haya rotación y 101 en caso de rotación.

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

C++

// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
 
// Function that finds the minimum
// number of flips to make the
// binary string alternating if
// left circular rotation is allowed
int MinimumFlips(string s, int n)
{
    int a[n];
 
    for(int i = 0; i < n; i++)
    {
        a[i] = (s[i] == '1' ? 1 : 0);
    }
 
    // Initialize prefix arrays to store
    // number of changes required to put
    // 1s at either even or odd position
    int oddone[n + 1];
    int evenone[n + 1];
 
    oddone[0] = 0;
    evenone[0] = 0;
 
    for(int i = 0; i < n; i++)
    {
         
        // If i is odd
        if (i % 2 != 0)
        {
             
            // Update the oddone
            // and evenone count
            oddone[i + 1] = oddone[i] +
                                (a[i] == 1 ? 1 : 0);
            evenone[i + 1] = evenone[i] +
                                  (a[i] == 0 ? 1 : 0);
        }
 
        // Else i is even
        else
        {
             
            // Update the oddone
            // and evenone count
            oddone[i + 1] = oddone[i] +
                                (a[i] == 0 ? 1 : 0);
            evenone[i + 1] = evenone[i] +
                                  (a[i] == 1 ? 1 : 0);
        }
    }
 
    // Initialize minimum flips
    int minimum = min(oddone[n], evenone[n]);
 
    // Check if substring[0, i] is
    // appended at end how many
    // changes will be required
    for(int i = 0; i < n; i++)
    {
        if (n % 2 != 0)
        {
            minimum = min(minimum,
                          oddone[n] -
                          oddone[i + 1] +
                         evenone[i + 1]);
            minimum = min(minimum,
                          evenone[n] -
                          evenone[i + 1] +
                           oddone[i + 1]);
        }
    }
 
    // Return minimum flips
    return minimum;
}
 
// Driver Code
int main()
{
     
    // Given String
    string S = "000001100";
 
    // Length of given string
    int n = S.length();
 
    // Function call
    cout << (MinimumFlips(S, n));
}
 
// This code is contributed by chitranayal

Java

// Java program for the above approach
import java.util.*;
 
class GFG {
 
    // Function that finds the minimum
    // number of flips to make the
    // binary string alternating if
    // left circular rotation is allowed
    static int MinimumFlips(String s, int n)
    {
        int[] a = new int[n];
 
        for (int i = 0; i < n; i++) {
            a[i] = (s.charAt(i) == '1' ? 1 : 0);
        }
 
        // Initialize prefix arrays to store
        // number of changes required to put
        // 1s at either even or odd position
        int[] oddone = new int[n + 1];
        int[] evenone = new int[n + 1];
 
        oddone[0] = 0;
        evenone[0] = 0;
 
        for (int i = 0; i < n; i++) {
 
            // If i is odd
            if (i % 2 != 0) {
 
                // Update the oddone
                // and evenone count
                oddone[i + 1]
                    = oddone[i]
                      + (a[i] == 1 ? 1 : 0);
                evenone[i + 1]
                    = evenone[i]
                      + (a[i] == 0 ? 1 : 0);
            }
 
            // Else i is even
            else {
 
                // Update the oddone
                // and evenone count
                oddone[i + 1]
                    = oddone[i]
                      + (a[i] == 0 ? 1 : 0);
                evenone[i + 1]
                    = evenone[i]
                      + (a[i] == 1 ? 1 : 0);
            }
        }
 
        // Initialize minimum flips
        int minimum = Math.min(oddone[n],
                               evenone[n]);
 
        // Check if substring[0, i] is
        // appended at end how many
        // changes will be required
        for (int i = 0; i < n; i++) {
            if (n % 2 != 0) {
                minimum = Math.min(minimum,
                                   oddone[n]
                                       - oddone[i + 1]
                                       + evenone[i + 1]);
                minimum = Math.min(minimum,
                                   evenone[n]
                                       - evenone[i + 1]
                                       + oddone[i + 1]);
            }
        }
 
        // Return minimum flips
        return minimum;
    }
 
    // Driver Code
    public static void main(String[] args)
    {
        // Given String
        String S = "000001100";
 
        // Length of given string
        int n = S.length();
 
        // Function call
        System.out.print(MinimumFlips(S, n));
    }
}

Python3

# Python3 program for the above approach
 
# Function that finds the minimum
# number of flips to make the
# binary string alternating if
# left circular rotation is allowed
def MinimumFlips(s, n):
 
    a = [0] * n
 
    for i in range(n):
        a[i] = 1 if s[i] == '1' else 0
 
    # Initialize prefix arrays to store
    # number of changes required to put
    # 1s at either even or odd position
    oddone = [0] * (n + 1)
    evenone = [0] * (n + 1)
 
    for i in range(n):
 
        # If i is odd
        if(i % 2 != 0):
 
            # Update the oddone
            # and evenone count
            if(a[i] == 1):
                oddone[i + 1] = oddone[i] + 1
            else:
                oddone[i + 1] = oddone[i] + 0
 
            if(a[i] == 0):
                evenone[i + 1] = evenone[i] + 1
            else:
                evenone[i + 1] = evenone[i] + 0
 
        # Else i is even
        else:
 
            # Update the oddone
            # and evenone count
            if (a[i] == 0):
                oddone[i + 1] = oddone[i] + 1
            else:
                oddone[i + 1] = oddone[i] + 0
 
            if (a[i] == 1):
                evenone[i + 1] = evenone[i] + 1
            else:
                evenone[i + 1] = evenone[i] + 0
 
    # Initialize minimum flips
    minimum = min(oddone[n], evenone[n])
 
    # Check if substring[0, i] is
    # appended at end how many
    # changes will be required
    for i in range(n):
        if(n % 2 != 0):
            minimum = min(minimum,
                          oddone[n] -
                          oddone[i + 1] +
                         evenone[i + 1])
 
            minimum = min(minimum,
                          evenone[n] -
                          evenone[i + 1] +
                           oddone[i + 1])
 
    # Return minimum flips
    return minimum
 
# Driver Code
 
# Given String
S = "000001100"
 
# Length of given string
n = len(S)
 
# Function call
print(MinimumFlips(S, n))
 
# This code is contributed by Shivam Singh

C#

// C# program for the above approach
using System;
class GFG{
 
  // Function that finds the minimum
  // number of flips to make the
  // binary string alternating if
  // left circular rotation is allowed
  static int MinimumFlips(String s, int n)
  {
    int[] a = new int[n];
 
    for (int i = 0; i < n; i++)
    {
      a[i] = (s[i] == '1' ? 1 : 0);
    }
 
    // Initialize prefix arrays to store
    // number of changes required to put
    // 1s at either even or odd position
    int[] oddone = new int[n + 1];
    int[] evenone = new int[n + 1];
 
    oddone[0] = 0;
    evenone[0] = 0;
 
    for (int i = 0; i < n; i++)
    {
 
      // If i is odd
      if (i % 2 != 0)
      {
 
        // Update the oddone
        // and evenone count
        oddone[i + 1] = oddone[i] +
                         (a[i] == 1 ? 1 : 0);
        evenone[i + 1] = evenone[i] +
                          (a[i] == 0 ? 1 : 0);
      }
 
      // Else i is even
      else
      {
 
        // Update the oddone
        // and evenone count
        oddone[i + 1] = oddone[i] +
                         (a[i] == 0 ? 1 : 0);
        evenone[i + 1] = evenone[i] +
                          (a[i] == 1 ? 1 : 0);
      }
    }
 
    // Initialize minimum flips
    int minimum = Math.Min(oddone[n],
                           evenone[n]);
 
    // Check if substring[0, i] is
    // appended at end how many
    // changes will be required
    for (int i = 0; i < n; i++)
    {
      if (n % 2 != 0)
      {
        minimum = Math.Min(minimum, oddone[n] -
                                       oddone[i + 1] +
                                    evenone[i + 1]);
        minimum = Math.Min(minimum, evenone[n] -
                                       evenone[i + 1] +
                                       oddone[i + 1]);
      }
    }
 
    // Return minimum flips
    return minimum;
  }
 
  // Driver Code
  public static void Main(String[] args)
  {
    // Given String
    String S = "000001100";
 
    // Length of given string
    int n = S.Length;
 
    // Function call
    Console.Write(MinimumFlips(S, n));
  }
}
 
// This code is contributed by Rajput-Ji

Javascript

<script>
// JavaScript program for the
// above approach
 
    // Function that finds the minimum
    // number of flips to make the
    // binary string alternating if
    // left circular rotation is allowed
    function MinimumFlips(s, n)
    {
        let a = Array.from({length: n+1}, (_, i) => 0);
  
        for (let i = 0; i < n; i++) {
            a[i] = (s[i] == '1' ? 1 : 0);
        }
  
        // Initialize prefix arrays to store
        // number of changes required to put
        // 1s at either even or odd position
        let oddone = Array.from({length: n+1}, (_, i) => 0);
        let evenone = Array.from({length: n+1}, (_, i) => 0);
  
        oddone[0] = 0;
        evenone[0] = 0;
  
        for (let i = 0; i < n; i++) {
  
            // If i is odd
            if (i % 2 != 0) {
  
                // Update the oddone
                // and evenone count
                oddone[i + 1]
                    = oddone[i]
                      + (a[i] == 1 ? 1 : 0);
                evenone[i + 1]
                    = evenone[i]
                      + (a[i] == 0 ? 1 : 0);
            }
  
            // Else i is even
            else {
  
                // Update the oddone
                // and evenone count
                oddone[i + 1]
                    = oddone[i]
                      + (a[i] == 0 ? 1 : 0);
                evenone[i + 1]
                    = evenone[i]
                      + (a[i] == 1 ? 1 : 0);
            }
        }
  
        // Initialize minimum flips
        let minimum = Math.min(oddone[n],
                               evenone[n]);
  
        // Check if substring[0, i] is
        // appended at end how many
        // changes will be required
        for (let i = 0; i < n; i++) {
            if (n % 2 != 0) {
                minimum = Math.min(minimum,
                                   oddone[n]
                                       - oddone[i + 1]
                                       + evenone[i + 1]);
                minimum = Math.min(minimum,
                                   evenone[n]
                                       - evenone[i + 1]
                                       + oddone[i + 1]);
            }
        }
  
        // Return minimum flips
        return minimum;
    }
 
// Driver Code
 
     // Given String
        let S = "000001100";
  
        // Length of given string
        let n = S.length;
  
        // Function call
        document.write(MinimumFlips(S, n));
 
</script>
Producción: 

3

 

Complejidad de tiempo: O(N), donde N es la longitud de la string dada.
Espacio Auxiliar: O(N)

Publicación traducida automáticamente

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