Compruebe si hay paréntesis equilibrados en una expresión | O(1) espacio | Complejidad de tiempo O(N^2)

Dada una string str que contiene los caracteres ‘(‘ , ‘)’ , ‘{‘ , ‘}’ , ‘[‘ y ‘]’ , la tarea es determinar si los paréntesis están equilibrados o no. Los paréntesis están balanceados si:

  1. Los corchetes abiertos deben cerrarse con el mismo tipo de corchetes.
  2. Los corchetes abiertos deben cerrarse en el orden correcto.

Ejemplos:

Entrada: str = “(())[]” Salida:Entrada: str = “))(({}{” Salida: No

Acercarse:

  • Mantenga dos variables i y j para realizar un seguimiento de los dos corchetes que se van a comparar.
  • Mantenga un recuento cuyo valor aumente al encontrar un paréntesis de apertura y disminuya al encontrar un paréntesis de cierre.
  • Establezca j = i , i = i + 1 y counter++ cuando se encuentren corchetes de apertura.
  • Cuando se encuentran corchetes de cierre, disminuya el conteo y compare los corchetes en i y j ,
    • Si los corchetes en i y j coinciden, entonces sustituya ‘#’ en la string en la i -ésima y j -ésima posición. Incremente i y disminuya j hasta que se encuentre un valor que no sea ‘#’ o j ≥ 0 .
    • Si los corchetes en i y j no coinciden, devuelve falso.
  • Si cuenta != 0 , devuelve falso.

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

C++

// C++ implementation of the approach
#include <iostream>
using namespace std;
 
// This helper function is called whenever
// closing bracket is encountered.
// Hence count is decremented
// j and i points to opening and closing
// brackets to be matched respectively
// If brackets at i and j is a match
// replace them with "#" character and decrement j
// to point next opening bracket to * be matched
// Similarly, increment i to point to next closing
// bracket to be matched
// If j is out of bound or brackets did not match return 0
bool helperFunc(int& count, string& s, int& i, int& j, char tocom)
{
    count--;
    if (j > -1 && s[j] == tocom) {
        s[i] = '#';
        s[j] = '#';
        while (j >= 0 && s[j] == '#')
            j--;
        i++;
        return 1;
    }
    else
        return 0;
}
 
// Function that returns true if s is a
// valid balanced bracket string
bool isValid(string s)
{
 
    // Empty string is considered balanced
    if (s.length() == 0)
        return true;
 
    else {
        int i = 0;
 
        // Increments for opening bracket and
        // decrements for closing bracket
        int count = 0;
        int j = -1;
        bool result;
        while (i < s.length()) {
            switch (s[i]) {
            case '}':
                result = helperFunc(count, s, i, j, '{');
                if (result == 0) {
                    return false;
                }
                break;
 
            case ')':
                result = helperFunc(count, s, i, j, '(');
                if (result == 0) {
                    return false;
                }
                break;
 
            case ']':
                result = helperFunc(count, s, i, j, '[');
                if (result == 0) {
                    return false;
                }
                break;
 
            default:
                j = i;
                i++;
                count++;
            }
        }
 
        // count != 0 indicates unbalanced parentheses
        // this check is required to handle cases where
        // count of opening brackets > closing brackets
        if (count != 0)
            return false;
 
        return true;
    }
}
 
// Driver code
int main()
{
    string str = "[[]][]()";
 
    if (isValid(str))
        cout << "Yes";
    else
        cout << "No";
 
    return 0;
}

Java

// Java implementation of the approach
import java.util.*;
 
class GFG
{
 
    static String s = "[[]][]()";
    static int count = 0;
    static int i = 0;
    static int j = -1;
 
// This helper function is called whenever
// closing bracket is encountered.
// Hence count is decremented
// j and i points to opening and closing
// brackets to be matched respectively
// If brackets at i and j is a match
// replace them with "#" character and decrement j
// to point next opening bracket to * be matched
// Similarly, increment i to point to next closing
// bracket to be matched
// If j is out of bound or brackets did not match return 0
static int helperFunc(char tocom)
{
    count--;
    char temp = s.charAt(j);
    if (j > -1 && temp == tocom)
    {
        s = s.replace(s.charAt(i),'#');
        s = s.replace(s.charAt(j),'#');
        temp = s.charAt(j);
        while (j >= 0 && temp == '#')
            j--;
        i++;
        return 1;
    }
    else
        return 0;
}
 
// Function that returns true if s is a
// valid balanced bracket string
static boolean isValid()
{
 
    // Empty string is considered balanced
    if (s.length() == 0)
        return true;
 
    else {
        int result;
        while (i < s.length())
        {
            char temp = s.charAt(i);
            if(temp=='}')
            {
                result = helperFunc('{');
                if (result == 0)
                {
                    return false;
                }
            }
            else if(temp == ')')
            {
                result = helperFunc('(');
                if (result == 0)
                {
                    return false;
                }
            }
 
            else if(temp == ']')
            {
                result = helperFunc('[');
                if (result == 0)
                {
                    return false;
                }
            }
                 
            else
            {
                j = i;
                i++;
                count++;
            }
        }
 
        // count != 0 indicates unbalanced parentheses
        // this check is required to handle cases where
        // count of opening brackets > closing brackets
        if (count != 0)
            return false;
 
        return true;
    }
}
 
// Driver code
public static void main(String args[])
{
    if (isValid())
    System.out.println("No");
    else
    System.out.println("Yes");
}
 
}
 
// This code is contributed by Surendra_Gangwar

Python3

# Python3 implementation of the approach
 
# These are defined as global because they
# are passed by reference
count = 0
i = 0
j = -1
 
# This helper function is called whenever
# closing bracket is encountered.
# Hence count is decremented
# j and i points to opening and closing
# brackets to be matched respectively
# If brackets at i and j is a match
# replace them with "#" character and decrement j
# to point next opening bracket to * be matched
# Similarly, increment i to point to next closing
# bracket to be matched
# If j is out of bound or brackets
# did not match return 0
def helperFunc(s, tocom):
    global i, j, count
    count -= 1
    if j > -1 and s[j] == tocom:
        s[i] = '#'
        s[j] = '#'
        while j >= 0 and s[j] == '#':
            j -= 1
        i += 1
        return 1
    else:
        return 0
 
# Function that returns true if s is a
# valid balanced bracket string
def isValid(s):
    global i, j, count
 
    # Empty string is considered balanced
    if len(s) == 0:
        return True
    else:
 
        # Increments for opening bracket and
        # decrements for closing bracket
        result = False
        while i < len(s):
            if s[i] == '}':
                result = helperFunc(s, '{')
                if result == 0:
                    return False
            elif s[i] == ')':
                result = helperFunc(s, '(')
                if result == 0:
                    return False
            elif s[i] == ']':
                result = helperFunc(s, '[')
                if result == 0:
                    return False
            else:
                j = i
                i += 1
                count += 1
 
        # count != 0 indicates unbalanced parentheses
        # this check is required to handle cases where
        # count of opening brackets > closing brackets
        if count != 0:
            return False
        return True
 
# Driver Code
if __name__ == "__main__":
    string = "[[]][]()"
    string = list(string)
 
    print("Yes") if isValid(string) else print("No")
 
# This code is contributed by
# sanjeev2552

C#

// C# implementation of the approach
using System;
 
class GFG{
 
static string s = "[[]][]()";
static int count = 0;
static int i = 0;
static int j = -1;
 
// This helper function is called whenever
// closing bracket is encountered. Hence
// count is decremented j and i points to
// opening and closing brackets to be matched
// respectively. If brackets at i and j is a match
// replace them with "#" character and decrement j
// to point next opening bracket to * be matched
// Similarly, increment i to point to next closing
// bracket to be matched. If j is out of bound or
// brackets did not match return 0
static int helperFunc(char tocom)
{
    count--;
    char temp = s[j];
     
    if (j > -1 && temp == tocom)
    {
        s = s.Replace(s[i],'#');
        s = s.Replace(s[j],'#');
         
        temp = s[j];
        while (j >= 0 && temp == '#')
            j--;
             
        i++;
        return 1;
    }
    else
        return 0;
}
 
// Function that returns true if s is a
// valid balanced bracket string
static bool isValid()
{
 
    // Empty string is considered balanced
    if (s.Length == 0)
        return true;
 
    else
    {
        int result;
         while (i < s.Length)
        {
            char temp = s[i];
            if(temp == '}')
            {
                result = helperFunc('{');
                if (result == 0)
                {
                    return false;
                }
            }
             
            else if(temp == ')')
            {
                result = helperFunc('(');
                if (result == 0)
                {
                    return false;
                }
            }
   
            else if(temp == ']')
            {
                result = helperFunc('[');
                if (result == 0) 
                {
                    return false;
                }
            }
                   
            else
            {
                j = i;
                i++;
                count++;
            }
        }
         
        // count != 0 indicates unbalanced
        // parentheses this check is required
        // to handle cases where count of opening
        // brackets > closing brackets
        if (count != 0)
            return false;
 
        return true;
    }
}
 
// Driver code
public static void Main(string []args)
{
    if (isValid())
    {
        Console.Write("No");
    }
    else
    {
        Console.Write("Yes");
    }
}
}
 
// This code is contributed by rutvik_56
Producción:

Yes

Espacio Auxiliar: O(1)

Publicación traducida automáticamente

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