Eliminación mínima de subsecuencias de distintos caracteres consecutivos necesarios para vaciar una string determinada

Dada una string binaria , str , la tarea es vaciar la string dada por el número mínimo de eliminaciones de un solo carácter o una subsecuencia que contenga distintos caracteres consecutivos de str .

Ejemplos:

Entrada: str = “0100100111” 
Salida:
Explicación: 
Eliminar la subsecuencia “010101” de la string modifica str a “0011”. 
Eliminar la subsecuencia «01» de la string modifica str a «01». 
Eliminar la subsecuencia «01» de la string modifica str a «», que es una string vacía. 
Por lo tanto, la salida requerida es 3.

Entrada: str = “010110” 
Salida: 2

 

Enfoque ingenuo: el enfoque más simple para resolver este problema es recorrer la string de forma repetitiva y eliminar la subsecuencia más larga de caracteres consecutivos distintos de la string e incrementar el recuento después de cada eliminación. Finalmente, imprima el conteo. 

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

Enfoque eficiente: el problema se puede resolver utilizando la técnica Greedy . Siga los pasos a continuación para resolver el problema:

  • Inicialice dos variables, digamos cntOne y cntZero , para almacenar el conteo de 1 s y 0 s.
  • Recorra la string usando la variable i y verifique las siguientes condiciones: 
    • Si str[i] == ‘0’ , incremente el valor de cntZero y verifique si el valor de cntOne es mayor que 0 o no. Si se determina que es cierto, disminuya el valor de cntOne .
    • Si str[i] == ‘1’ , entonces incremente el valor de cntOne y verifique si el valor de cntZero es mayor que 0 o no. Si se determina que es cierto, disminuya el valor de cntZero .
  • Finalmente, imprima el valor de (cntZero + cntOne) .

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

C++

// C++ program to implement
// the above approach
 
#include <bits/stdc++.h>
using namespace std;
 
//Function to count minimum operations required
// to make the string an empty string
int findMinOperationsReqEmpStr(string str)
{
    // Stores count of 1s by removing
    // consecutive distinct subsequence
    int cntOne = 0;
 
    // Stores count of 0s by removing
    // consecutive distinct subsequence
    int cntZero = 0 ;
 
    // Stores length of str
    int N = str.length();
 
    // Traverse the string
    for (int i = 0; i < N; i++) {
 
        // If current character
        // is 0
        if(str[i] == '0'){
            if (cntOne) {
 
                // Update cntOne
                cntOne--;
            }
 
            // Update cntZero
            cntZero++;
        }
 
        // If current character
        // is 1
        else{
 
            //Update cntZero
            if (cntZero) {
                cntZero--;
            }
             
             
            // Update cntOne
            cntOne++;
        }
    }
     
    return (cntOne + cntZero);
}
 
 
// Driver Code
int main()
{
    string str = "0100100111";
    cout<< findMinOperationsReqEmpStr(str);
}

Java

// Java program to implement
// the above approach
import java.util.*;
import java.lang.*;
 
class GFG{
 
//Function to count minimum operations required
// to make the string an empty string
static int findMinOperationsReqEmpStr(String str)
{
     
    // Stores count of 1s by removing
    // consecutive distinct subsequence
    int cntOne = 0;
 
    // Stores count of 0s by removing
    // consecutive distinct subsequence
    int cntZero = 0;
 
    // Stores length of str
    int N = str.length();
 
    // Traverse the string
    for(int i = 0; i < N; i++)
    {
         
        // If current character
        // is 0
        if(str.charAt(i) == '0')
        {
            if (cntOne != 0)
            {
                 
                // Update cntOne
                cntOne--;
            }
 
            // Update cntZero
            cntZero++;
        }
 
        // If current character
        // is 1
        else
        {
             
            // Update cntZero
            if (cntZero != 0)
            {
                cntZero--;
            }
             
            // Update cntOne
            cntOne++;
        }
    }
    return (cntOne + cntZero);
}
 
// Driver code
public static void main(String[] args)
{
    String str = "0100100111";
     
    System.out.print(findMinOperationsReqEmpStr(str));
}
}
 
// This code is contributed by ajaykr00kj

Python3

# Python3 program to implement
# the above approach
 
# Function to count minimum operations
# required to make the string an empty
# string
def findMinOperationsReqEmpStr(str):
     
    # Stores count of 1s by removing
    # consecutive distinct subsequence
    cntOne = 0
   
    # Stores count of 0s by removing
    # consecutive distinct subsequence
    cntZero = 0
     
    # Traverse the string
    for element in str:
         
        # If current character
        # is 0
        if element == '0':
            if cntOne > 0: 
   
                # Update cntOne
                cntOne = cntOne - 1
                 
            # Update cntZero
            cntZero = cntZero + 1
             
        # If current character
        # is 1
        else:
             
            # Update cntZero
            if cntZero > 0:
                cntZero = cntZero - 1
              
            # Update cntOne
            cntOne = cntOne + 1
     
    return cntOne + cntZero  
     
# Driver code
if __name__ == "__main__":
     
    str = "0100100111"
     
    print(findMinOperationsReqEmpStr(str))
 
# This code is contributed by ajaykr00kj

C#

// C# program to implement
// the above approach
using System;
 
class GFG
{
 
// Function to count minimum operations required
// to make the string an empty string
static int findMinOperationsReqEmpStr(String str)
{
     
    // Stores count of 1s by removing
    // consecutive distinct subsequence
    int cntOne = 0;
 
    // Stores count of 0s by removing
    // consecutive distinct subsequence
    int cntZero = 0;
 
    // Stores length of str
    int N = str.Length;
 
    // Traverse the string
    for(int i = 0; i < N; i++)
    {
         
        // If current character
        // is 0
        if(str[i] == '0')
        {
            if (cntOne != 0)
            {
                 
                // Update cntOne
                cntOne--;
            }
 
            // Update cntZero
            cntZero++;
        }
 
        // If current character
        // is 1
        else
        {
             
            // Update cntZero
            if (cntZero != 0)
            {
                cntZero--;
            }
             
            // Update cntOne
            cntOne++;
        }
    }
    return (cntOne + cntZero);
}
 
// Driver code
public static void Main(String[] args)
{
    String str = "0100100111";
     
    Console.Write(findMinOperationsReqEmpStr(str));
}
}
 
// This code is contributed by 29AjayKumar

Javascript

<script>
 
// Javascript program to implement
// the above approach
 
// Function to count minimum operations required
// to make the string an empty string
function findMinOperationsReqEmpStr(str)
{
     
    // Stores count of 1s by removing
    // consecutive distinct subsequence
    let cntOne = 0;
  
    // Stores count of 0s by removing
    // consecutive distinct subsequence
    let cntZero = 0;
  
    // Stores length of str
    let N = str.length;
  
    // Traverse the string
    for(let i = 0; i < N; i++)
    {
          
        // If current character
        // is 0
        if (str[i] == '0')
        {
            if (cntOne != 0)
            {
                 
                // Update cntOne
                cntOne--;
            }
  
            // Update cntZero
            cntZero++;
        }
  
        // If current character
        // is 1
        else
        {
             
            // Update cntZero
            if (cntZero != 0)
            {
                cntZero--;
            }
              
            // Update cntOne
            cntOne++;
        }
    }
    return (cntOne + cntZero);
}
     
// Driver code
let str = "0100100111";
  
document.write(findMinOperationsReqEmpStr(str));
 
// This code is contributed by code_hunt
 
</script>
Producción: 

3

 

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

Publicación traducida automáticamente

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