Minimice la cantidad de vueltas requeridas de modo que ninguna substring de 0 tenga una longitud superior a K

Dada una string binaria str de longitud N y un entero K donde K está en el rango (1 ≤ K ≤ N), la tarea es encontrar el número mínimo de vueltas (conversión de 0 s a 1 o viceversa) requeridas para ser realizado en la string dada de modo que la string resultante no contenga K o más ceros juntos.

Ejemplos:

Entrada: str = “11100000011”, K = 3 
Salida:
Explicación: 
Voltear los caracteres 6 y 7 modifica la string a “11100110011”  . Por lo tanto, ninguna substring de 0 está presente en la string que tiene una longitud de 3 o más.

Entrada: str = «110011», K = 1 
Salida:
Invierta el tercer y cuarto carácter y luego str = «111111», que no contiene 1 o más ceros juntos.

Enfoque ingenuo: el enfoque más simple es generar todas las substrings posibles de la string dada y, para cada substring, verificar si consta solo de 0 o no. Si se encuentra que es cierto, verifique si su longitud excede K o no. Si se determina que es cierto, cuente el número de vueltas requeridas para esa substring. Finalmente, imprima el conteo de volteretas obtenidas.

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

Enfoque eficiente: para hacer que el recuento de ceros contiguos en la string resultante sea menor que K , elija las substrings que constan solo de ceros de longitud ≥ K . Entonces, el problema se reduce a encontrar los cambios mínimos en cada substring. El resultado final será la suma de los giros mínimos de todos esos subsegmentos. A continuación se muestran los pasos:

  1. Inicialice el resultado a 0 y el recuento de ceros contiguos (por ejemplo, cnt_zeros ) a 0 .
  2. Atraviese la string y, al encontrar un ‘0’, incremente cnt_zeros en 1 .
  3. Si cnt_zeros se vuelve igual a K , incremente el resultado y establezca cnt_zeros en 0 .
  4. Y cuando aparece un ‘1’ , establezca cnt_zeros en 0 , ya que el recuento de ceros contiguos debería convertirse en 0 .

Debajo de la implementación del enfoque anterior:

C++

// C++ program to implement
// the above approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to return minimum
// number of flips required
int min_flips(string& str, int k)
{
    // Base Case
    if (str.size() == 0)
        return 0;
 
    // Stores the count of
    // minimum number of flips
    int ans = 0;
 
    // Stores the count of zeros
    // in current substring
    int cnt_zeros = 0;
 
    for (char ch : str) {
 
        // If current character is 0
        if (ch == '0') {
 
            // Continue ongoing
            // substring
            ++cnt_zeros;
        }
        else {
 
            // Start a new substring
            cnt_zeros = 0;
        }
 
        // If k consecutive
        // zeroes are obtained
        if (cnt_zeros == k) {
            ++ans;
 
            // End segment
            cnt_zeros = 0;
        }
    }
 
    // Return the result
    return ans;
}
 
// Driver Code
int main()
{
    string str = "11100000011";
    int k = 3;
 
    // Function call
    cout << min_flips(str, k);
    return 0;
}

Java

// Java program to implement
// the above approach
class GFG{
 
// Function to return minimum
// number of flips required
static int min_flips(String str, int k)
{
     
    // Base Case
    if (str.length() == 0)
        return 0;
 
    // Stores the count of
    // minimum number of flips
    int ans = 0;
 
    // Stores the count of zeros
    // in current subString
    int cnt_zeros = 0;
 
    for(char ch : str.toCharArray())
    {
         
        // If current character is 0
        if (ch == '0')
        {
             
            // Continue ongoing
            // subString
            ++cnt_zeros;
        }
        else
        {
             
            // Start a new subString
            cnt_zeros = 0;
        }
 
        // If k consecutive
        // zeroes are obtained
        if (cnt_zeros == k)
        {
            ++ans;
             
            // End segment
            cnt_zeros = 0;
        }
    }
 
    // Return the result
    return ans;
}
 
// Driver Code
public static void main(String[] args)
{
    String str = "11100000011";
    int k = 3;
 
    // Function call
    System.out.print(min_flips(str, k));
}
}
 
// This code is contributed by 29AjayKumar

Python3

# Python3 program to implement
# the above approach
 
# Function to return minimum
# number of flips required
def min_flips(strr, k):
     
    # Base Case
    if (len(strr) == 0):
        return 0
 
    # Stores the count of
    # minimum number of flips
    ans = 0
 
    # Stores the count of zeros
    # in current sub
    cnt_zeros = 0
 
    for ch in strr:
 
        # If current character is 0
        if (ch == '0'):
 
            # Continue ongoing
            # sub
            cnt_zeros += 1
        else:
 
            # Start a new sub
            cnt_zeros = 0
 
        # If k consecutive
        # zeroes are obtained
        if (cnt_zeros == k):
            ans += 1
 
            # End segment
            cnt_zeros = 0
 
    # Return the result
    return ans
 
# Driver Code
if __name__ == '__main__':
     
    strr = "11100000011"
    k = 3
 
    # Function call
    print(min_flips(strr, k))
 
# This code is contributed by mohit kumar 29

C#

// C# program to implement
// the above approach
using System;
 
class GFG{
 
// Function to return minimum
// number of flips required
static int min_flips(String str, int k)
{
     
    // Base Case
    if (str.Length == 0)
        return 0;
 
    // Stores the count of
    // minimum number of flips
    int ans = 0;
 
    // Stores the count of zeros
    // in current subString
    int cnt_zeros = 0;
 
    foreach(char ch in str.ToCharArray())
    {
         
        // If current character is 0
        if (ch == '0')
        {
             
            // Continue ongoing
            // subString
            ++cnt_zeros;
        }
        else
        {
             
            // Start a new subString
            cnt_zeros = 0;
        }
 
        // If k consecutive
        // zeroes are obtained
        if (cnt_zeros == k)
        {
            ++ans;
             
            // End segment
            cnt_zeros = 0;
        }
    }
 
    // Return the result
    return ans;
}
 
// Driver Code
public static void Main(String[] args)
{
    String str = "11100000011";
    int k = 3;
 
    // Function call
    Console.Write(min_flips(str, k));
}
}
 
// This code is contributed by 29AjayKumar

Javascript

<script>
// javascript program for the
// above approach
 
// Function to return minimum
// number of flips required
function min_flips(str, k)
{
       
    // Base Case
    if (str.length == 0)
        return 0;
   
    // Stores the count of
    // minimum number of flips
    let ans = 0;
   
    // Stores the count of zeros
    // in current subString
    let cnt_zeros = 0;
   
    for(let ch in str.split(''))
    {
           
        // If current character is 0
        if (str[ch] == '0')
        {
               
            // Continue ongoing
            // subString
            ++cnt_zeros;
        }
        else
        {
               
            // Start a new subString
            cnt_zeros = 0;
        }
   
        // If k consecutive
        // zeroes are obtained
        if (cnt_zeros == k)
        {
            ++ans;
               
            // End segment
            cnt_zeros = 0;
        }
    }
   
    // Return the result
    return ans;
}
  
// Driver Code
 
    let str = "11100000011";
    let k = 3;
   
    // Function call
    document.write(min_flips(str, k));
  
 // This code is contributed by decode2207.
</script>
Producción: 

2

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

Publicación traducida automáticamente

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