Dada una string S de longitud N que consta solo de caracteres «(« y «)» , la tarea es convertir la string dada en una secuencia de paréntesis balanceada seleccionando cualquier substring de la string S dada y reordenar los caracteres de esa substring. Considerando que la longitud de cada substring es el costo de cada operación, minimice el costo total requerido.
Una string se llama balanceada si cada paréntesis de apertura “(” tiene un paréntesis de cierre correspondiente “)” .
Ejemplos:
Entrada: str = «)(()»
Salida: 2
Explicación:
Elija la substring S[0, 1] ( = «)(« ) y reorganícela a «()». Costo = 2.
Ahora, la string se modifica a S = “()()”, que está equilibrado.Entrada: S = “()))”
Salida: -1
Enfoque: La idea es verificar primero si la string puede equilibrarse o no , es decir, contar el número de paréntesis abiertos y cerrados y si son desiguales, luego imprimir -1 . De lo contrario, siga los pasos a continuación para encontrar el costo mínimo total:
- Inicialice una array arr[] de longitud N .
- Inicialice sum como 0 para actualizar los elementos de la array con los valores sum .
- Recorra la string dada de i = 0 a N – 1 y realice los siguientes pasos:
- Si el carácter actual es “(“ , actualice arr[i] como (sum + 1) . De lo contrario, actualice arr[i] como (sum – 1) .
- Actualice el valor de sum como arr[i] .
- Después de completar los pasos anteriores, si el valor de arr[N – 1] no es cero, la string no se puede equilibrar e imprimir “-1” .
- Si la string se puede equilibrar, imprima la suma de los tamaños del subarreglo disjunto que tenga la suma 0 como resultado.
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 to count minimum number of // operations to convert the string to // a balanced bracket sequence void countMinMoves(string str) { int n = str.size(); // Initialize the integer array int a[n] = { 0 }; int j, ans = 0, i, sum = 0; // Traverse the string for (i = 0; i < n; i++) { // Decrement a[i] if (str[i] == ')') { a[i] += sum - 1; } // Increment a[i] else { a[i] += sum + 1; } // Update the sum as current // value of arr[i] sum = a[i]; } // If answer exists if (sum == 0) { // Traverse from i i = 1; // Find all substrings with 0 sum while (i < n) { j = i - 1; while (i < n && a[i] != 0) i++; if (i < n && a[i - 1] < 0) { ans += i - j; if (j == 0) ans++; } i++; } // Print the sum of sizes cout << ans << endl; } // No answer exists else cout << "-1\n"; } // Driver Code int main() { string str = ")(()"; countMinMoves(str); return 0; }
Java
// Java program for the above approach class GFG { // Function to count minimum number of // operations to convert the string to // a balanced bracket sequence static void countMinMoves(String str) { int n = str.length(); // Initialize the integer array int a[] = new int[n]; int j, ans = 0, i, sum = 0; // Traverse the string for (i = 0; i < n; i++) { // Decrement a[i] if (str.charAt(i) == ')') { a[i] += sum - 1; } // Increment a[i] else { a[i] += sum + 1; } // Update the sum as current // value of arr[i] sum = a[i]; } // If answer exists if (sum == 0) { // Traverse from i i = 1; // Find all substrings with 0 sum while (i < n) { j = i - 1; while (i < n && a[i] != 0) i++; if (i < n && a[i - 1] < 0) { ans += i - j; if (j == 0) ans++; } i++; } // Print the sum of sizes System.out.println(ans); } // No answer exists else System.out.println("-1"); } // Driver Code public static void main(String[] args) { String str = ")(()"; countMinMoves(str); } } // This code is contributed by AnkThon
Python3
# Python3 program for the above approach # Function to count minimum number of # operations to convert the string to # a balanced bracket sequence def countMinMoves(str): n = len(str) # Initialize the integer array a = [0 for i in range(n)] j, ans, sum = 0, 0, 0 # Traverse the string for i in range(n): # Decrement a[i] if (str[i] == ')'): a[i] += sum - 1 # Increment a[i] else: a[i] += sum + 1 # Update the sum as current # value of arr[i] sum = a[i] # If answer exists if (sum == 0): # Traverse from i i = 1 # Find all substrings with 0 sum while (i < n): j = i - 1 while (i < n and a[i] != 0): i += 1 if (i < n and a[i - 1] < 0): ans += i - j if (j == 0): ans += 1 i += 1 # Print the sum of sizes print(ans) # No answer exists else: print("-1") # Driver Code if __name__ == '__main__': str = ")(()" countMinMoves(str) # This code is contributed by mohit kumar 29
C#
// C# program for the above approach using System; class GFG { // Function to count minimum number of // operations to convert the string to // a balanced bracket sequence static void countMinMoves(string str) { int n = str.Length; // Initialize the integer array int []a = new int[n]; int j, ans = 0, i, sum = 0; // Traverse the string for (i = 0; i < n; i++) { // Decrement a[i] if (str[i] == ')') { a[i] += sum - 1; } // Increment a[i] else { a[i] += sum + 1; } // Update the sum as current // value of arr[i] sum = a[i]; } // If answer exists if (sum == 0) { // Traverse from i i = 1; // Find all substrings with 0 sum while (i < n) { j = i - 1; while (i < n && a[i] != 0) i++; if (i < n && a[i - 1] < 0) { ans += i - j; if (j == 0) ans++; } i++; } // Print the sum of sizes Console.WriteLine(ans); } // No answer exists else Console.WriteLine("-1"); } // Driver Code public static void Main() { string str = ")(()"; countMinMoves(str); } } // This code is contributed by bgangwar59
Javascript
<script> // JavaScript program for the above approach // Function to count minimum number of // operations to convert the string to // a balanced bracket sequence function countMinMoves(str) { var n = str.length; // Initialize the integer array var a = Array(n).fill(0); var j, ans = 0, i, sum = 0; // Traverse the string for (i = 0; i < n; i++) { // Decrement a[i] if (str[i] == ')') { a[i] += sum - 1; } // Increment a[i] else { a[i] += sum + 1; } // Update the sum as current // value of arr[i] sum = a[i]; } // If answer exists if (sum == 0) { // Traverse from i i = 1; // Find all substrings with 0 sum while (i < n) { j = i - 1; while (i < n && a[i] != 0) i++; if (i < n && a[i - 1] < 0) { ans += i - j; if (j == 0) ans++; } i++; } // Print the sum of sizes document.write( ans + "<br>"); } // No answer exists else document.write( "-1<br>"); } // Driver Code var str = ")(()"; countMinMoves(str); </script>
2
Complejidad temporal: O(N)
Espacio auxiliar: O(N)
Publicación traducida automáticamente
Artículo escrito por sanachaitali30 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA