Número mínimo de inversiones de paréntesis necesarias para equilibrar una expresión | Juego – 2

Dada una expresión con solo ‘}’ y ‘{‘. La expresión puede no estar equilibrada. La tarea es encontrar el número mínimo de inversiones de paréntesis para equilibrar la expresión.
Ejemplos: 
 

Input : exp = "}{"
Output : 2
We need to change '}' to '{' and '{' to
'}' so that the expression becomes balanced, 
the balanced expression is '{}'

Input : exp = "}{{}}{{{"
Output : 3
The balanced expression is "{{{}}{}}"

La solución discutida en la publicación anterior requiere O (n) espacio adicional. El problema se puede resolver utilizando el espacio constante. 
La idea es usar dos variables abrir y cerrar donde, abrir representa el número de paréntesis de apertura desequilibrados y cerrar representa el número de paréntesis de cierre desequilibrados. 
Atraviese la string y, si el carácter actual es un corchete de apertura, incremente open . Si el carácter actual es un corchete de cierre, verifique si hay corchetes de apertura desequilibrados ( abierto > 0). En caso afirmativo, disminuya la apertura ; de lo contrario, aumente el cierre , ya que este soporte está desequilibrado.
A continuación se muestra la implementación del enfoque anterior: 
 

C++

// C++ program to find minimum number of
// reversals required to balance an expression
#include <bits/stdc++.h>
using namespace std;
 
// Returns count of minimum reversals for making
// expr balanced. Returns -1 if expr cannot be
// balanced.
int countMinReversals(string expr)
{
    int len = expr.length();
 
    // length of expression must be even to make
    // it balanced by using reversals.
    if (len % 2)
        return -1;
 
    // To store number of reversals required.
    int ans = 0;
 
    int i;
 
    // To store number of unbalanced opening brackets.
    int open = 0;
 
    // To store number of unbalanced closing brackets.
    int close = 0;
 
    for (i = 0; i < len; i++) {
 
        // If current bracket is open then increment
        // open count.
        if (expr[i] == '{')
            open++;
 
        // If current bracket is close, check if it
        // balances opening bracket. If yes then
        // decrement count of unbalanced opening
        // bracket else increment count of
        // closing bracket.
        else {
            if (!open)
                close++;
            else
                open--;
        }
    }
 
    ans = (close / 2) + (open / 2);
 
    // For the case: "}{" or when one closing and
    // one opening bracket remains for pairing, then
    // both need to be reversed.
    close %= 2;
    open %= 2;
    if (close)
        ans += 2;
 
    return ans;
}
 
// Driver Code
int main()
{
    string expr = "}}{{";
 
    cout << countMinReversals(expr);
 
    return 0;
}

Java

// Java program to find minimum number of
// reversals required to balance an expression
class GFG
{
 
// Returns count of minimum reversals for making
// expr balanced. Returns -1 if expr cannot be
// balanced.
static int countMinReversals(String expr)
{
    int len = expr.length();
 
    // length of expression must be even to make
    // it balanced by using reversals.
    if (len % 2 != 0)
        return -1;
 
    // To store number of reversals required.
    int ans = 0;
 
    int i;
 
    // To store number of unbalanced opening brackets.
    int open = 0;
 
    // To store number of unbalanced closing brackets.
    int close = 0;
 
    for (i = 0; i < len; i++)
    {
 
        // If current bracket is open then increment
        // open count.
        if (expr.charAt(i) == '{')
            open++;
 
        // If current bracket is close, check if it
        // balances opening bracket. If yes then
        // decrement count of unbalanced opening
        // bracket else increment count of
        // closing bracket.
        else
        {
            if (open == 0)
                close++;
            else
                open--;
        }
    }
 
    ans = (close / 2) + (open / 2);
 
    // For the case: "}{" or when one closing and
    // one opening bracket remains for pairing, then
    // both need to be reversed.
    close %= 2;
    open %= 2;
    if (close != 0)
        ans += 2;
 
    return ans;
}
 
// Driver Code
public static void main(String args[])
{
    String expr = "}}{{";
 
    System.out.println(countMinReversals(expr));
}
}
 
// This code is contributed by Arnab Kundu

Python3

# Python3 program to find minimum number of
# reversals required to balance an expression
 
# Returns count of minimum reversals for
# making expr balanced. Returns -1 if
# expr cannot be balanced.
def countMinReversals(expr):
 
    length = len(expr)
 
    # length of expression must be even to
    # make it balanced by using reversals.
    if length % 2:
        return -1
 
    # To store number of reversals required.
    ans = 0
 
    # To store number of unbalanced
    # opening brackets.
    open = 0
 
    # To store number of unbalanced
    # closing brackets.
    close = 0
 
    for i in range(0, length):
 
        # If current bracket is open
        # then increment open count.
        if expr[i] == "":
            open += 1
 
        # If current bracket is close, check if it
        # balances opening bracket. If yes then
        # decrement count of unbalanced opening
        # bracket else increment count of
        # closing bracket.
        else:
            if not open:
                close += 1
            else:
                open -= 1
         
    ans = (close // 2) + (open // 2)
 
    # For the case: "" or when one closing
    # and one opening bracket remains for
    # pairing, then both need to be reversed.
    close %= 2
    open %= 2
     
    if close > 0:
        ans += 2
 
    return ans
 
# Driver Code
if __name__ == "__main__":
 
    expr = "}}{{"
    print(countMinReversals(expr))
 
# This code is contributed by Rituraj Jain

C#

// C# program to find minimum number of
// reversals required to balance an expression
using System;
     
class GFG
{
 
// Returns count of minimum reversals for making
// expr balanced. Returns -1 if expr cannot be
// balanced.
static int countMinReversals(String expr)
{
    int len = expr.Length;
 
    // length of expression must be even to make
    // it balanced by using reversals.
    if (len % 2 != 0)
        return -1;
 
    // To store number of reversals required.
    int ans = 0;
 
    int i;
 
    // To store number of unbalanced opening brackets.
    int open = 0;
 
    // To store number of unbalanced closing brackets.
    int close = 0;
 
    for (i = 0; i < len; i++)
    {
 
        // If current bracket is open then increment
        // open count.
        if (expr[i] == '{')
            open++;
 
        // If current bracket is close, check if it
        // balances opening bracket. If yes then
        // decrement count of unbalanced opening
        // bracket else increment count of
        // closing bracket.
        else
        {
            if (open == 0)
                close++;
            else
                open--;
        }
    }
 
    ans = (close / 2) + (open / 2);
 
    // For the case: "}{" or when one closing and
    // one opening bracket remains for pairing, then
    // both need to be reversed.
    close %= 2;
    open %= 2;
    if (close != 0)
        ans += 2;
 
    return ans;
}
 
// Driver Code
public static void Main(String []args)
{
    String expr = "}}{{";
 
    Console.WriteLine(countMinReversals(expr));
}
}
 
// This code contributed by Rajput-Ji

Javascript

<script>
 
// Javascript program to find minimum number of
// reversals required to balance an expression
 
// Returns count of minimum reversals for making
// expr balanced. Returns -1 if expr cannot be
// balanced.
function countMinReversals(expr)
{
    var len = expr.length;
 
    // length of expression must be even to make
    // it balanced by using reversals.
    if (len % 2)
        return -1;
 
    // To store number of reversals required.
    var ans = 0;
 
    var i;
 
    // To store number of unbalanced opening brackets.
    var open = 0;
 
    // To store number of unbalanced closing brackets.
    var close = 0;
 
    for (i = 0; i < len; i++) {
 
        // If current bracket is open then increment
        // open count.
        if (expr[i] == '{')
            open++;
 
        // If current bracket is close, check if it
        // balances opening bracket. If yes then
        // decrement count of unbalanced opening
        // bracket else increment count of
        // closing bracket.
        else {
            if (!open)
                close++;
            else
                open--;
        }
    }
 
    ans = (close / 2) + (open / 2);
 
    // For the case: "}{" or when one closing and
    // one opening bracket remains for pairing, then
    // both need to be reversed.
    close %= 2;
    open %= 2;
    if (close)
        ans += 2;
 
    return ans;
}
 
// Driver Code
var expr = "}}{{";
document.write( countMinReversals(expr));
 
// This code is contributed by noob2000.
</script>
Producción: 

2

 

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

Publicación traducida automáticamente

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