给定一个只有“}”和“{”的表达式。该表达式可能不平衡。请找到最小的括号反转数,使表达式平衡。 例如:
Input: exp = "}{"Output: 2We need to change '}' to '{' and '{' to'}' so that the expression becomes balanced, the balanced expression is '{}'Input: exp = "{{{"Output: Can't be made balanced using reversalsInput: exp = "{{{{"Output: 2 Input: exp = "{{{{}}"Output: 1 Input: exp = "}{{}}{{{"Output: 3
一个简单的观察是,只有当括号的总数为偶数时(必须有相等的“{”和“}”)字符串才能平衡 A. 天真的解决方案 是考虑每一个括号和递归计数的倒数,采取两种情况下(i)保持支架,因为它是(ii)逆转支架。如果我们得到一个平衡的表达式,如果到达这里的步数小于到目前为止的最小值,我们将更新结果。该解的时间复杂度为O(2) N ).
一 有效解决方案 可以在O(n)时间内解决这个问题。我们的想法是首先去掉表达的所有平衡部分。例如,convert“} {{}} {{{”到“}{{”通过移除突出显示的部分。如果我们仔细观察,我们可以注意到,在移除平衡部分后,我们总是得到一个形式为}…}{…{的表达式,这个表达式包含0个或更多的结束括号,后面是0个或更多的开始括号。 形式为“}}..}{{..{”的表达式需要多少个最小反转。设m为闭括号的总数,n为开括号的数目。我们需要⌈m/2⌉ + ⌈n/2⌉ 反转。例如}{{{{需要2+1个反转。 以下是上述想法的实施:
C++14
// 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; // After this loop, stack contains unbalanced // part of expression, i.e., expression of the // form "}}..}{{..{" stack< char > s; for ( int i=0; i<len; i++) { if (expr[i]== '}' && !s.empty()) { if (s.top()== '{' ) s.pop(); else s.push(expr[i]); } else s.push(expr[i]); } // Length of the reduced expression // red_len = (m+n) int red_len = s.size(); // count opening brackets at the end of // stack int n = 0; while (!s.empty() && s.top() == '{' ) { s.pop(); n++; } // return ceil(m/2) + ceil(n/2) which is // actually equal to (m+n)/2 + n%2 when // m+n is even. return (red_len/2 + n%2); } // Driver program to test above function int main() { string expr = "}}{{" ; cout << countMinReversals(expr); return 0; } |
JAVA
//Java Code to count minimum reversal for //making an expression balanced. import java.util.Stack; public class GFG { // Method count minimum reversal for //making an expression balanced. //Returns -1 if expression 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 ; // After this loop, stack contains unbalanced // part of expression, i.e., expression of the // form "}}..}{{..{" Stack<Character> s= new Stack<>(); for ( int i= 0 ; i<len; i++) { char c = expr.charAt(i); if (c == '}' && !s.empty()) { if (s.peek()== '{' ) s.pop(); else s.push(c); } else s.push(c); } // Length of the reduced expression // red_len = (m+n) int red_len = s.size(); // count opening brackets at the end of // stack int n = 0 ; while (!s.empty() && s.peek() == '{' ) { s.pop(); n++; } // return ceil(m/2) + ceil(n/2) which is // actually equal to (m+n)/2 + n%2 when // m+n is even. return (red_len/ 2 + n% 2 ); } // Driver method public static void main(String[] args) { String expr = "}}{{" ; System.out.println(countMinReversals(expr)); } } //This code is contributed by Sumit Ghosh |
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): lenn = len (expr) # length of expression must be even # to make it balanced by using reversals. if (lenn % 2 ) : return - 1 # After this loop, stack contains # unbalanced part of expression, # i.e., expression of the form "...." s = [] for i in range (lenn): if (expr[i] = = '' and len (s)): if (s[ 0 ] = = '') : s.pop( 0 ) else : s.insert( 0 , expr[i]) else : s.insert( 0 , expr[i]) # Length of the reduced expression # red_len = (m+n) red_len = len (s) # count opening brackets at the # end of stack n = 0 while ( len (s) and s[ 0 ] = = '') : s.pop( 0 ) n + = 1 # return ceil(m/2) + ceil(n/2) which # is actually equal to (m+n)/2 + n%2 # when m+n is even. return (red_len / / 2 + n % 2 ) # Driver Code if __name__ = = '__main__' : expr = "}}{{" print (countMinReversals(expr.strip())) # This code is contributed by # Shubham Singh(SHUBHAMSINGH10) |
C#
// C# Code to count minimum reversal for // making an expression balanced. using System; using System.Collections.Generic; class GFG { // Method count minimum reversal for // making an expression balanced. // Returns -1 if expression cannot be balanced public 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; } // After this loop, stack contains // unbalanced part of expression, // i.e., expression of the form "}}..}{{..{" Stack< char > s = new Stack< char >(); for ( int i = 0; i < len; i++) { char c = expr[i]; if (c == '}' && s.Count > 0) { if (s.Peek() == '{' ) { s.Pop(); } else { s.Push(c); } } else { s.Push(c); } } // Length of the reduced expression // red_len = (m+n) int red_len = s.Count; // count opening brackets at // the end of stack int n = 0; while (s.Count > 0 && s.Peek() == '{' ) { s.Pop(); n++; } // return ceil(m/2) + ceil(n/2) which is // actually equal to (m+n)/2 + n%2 when // m+n is even. return (red_len / 2 + n % 2); } // Driver Code public static void Main( string [] args) { string expr = "}}{{" ; Console.WriteLine(countMinReversals(expr)); } } // This code is contributed by Shrikant13 |
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) { let len = expr.length; // Expressions of odd lengths // cannot be balanced if (len % 2) return -1; // After this loop, stack contains unbalanced // part of expression, i.e., expression of the // form "}}..}{{..{" var s = new Array(); for (let i = 0; i < len; i++) { if (expr[i] == '}' && !s.length == 0) { if (s[s.length - 1] == '{' ) s.pop(); else s.push(expr[i]); } else s.push(expr[i]); } // Length of the reduced expression // red_len = (m+n) let red_len = s.length; // count opening brackets at the end of // stack let n = 0; while (!s.length == 0 && s[s.length - 1] == '{' ) { s.pop(); n++; } // return ceil(m/2) + ceil(n/2) which is // actually equal to (m+n)/2 + n%2 when // m+n is even. return (red_len / 2 + n % 2); } // Driver program to test above function let expr = "}}{{" ; document.write(countMinReversals(expr)); </script> |
2
输出:
2
时间复杂性: O(n) 辅助空间: O(n)
另一个 有效解决方案 在O(1)即常数空间中求解问题。因为表达式只包含一种类型的括号,所以我们的想法是维护两个变量,以保持左括号和右括号的计数,就像我们在中所做的那样 最长有效子字符串的长度 .如果表达式有平衡括号,那么我们减少左变量,否则增加右变量。然后我们只需要返回ceil(左/2)+ceil(右/2)。
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(); // Expressions of odd lengths // cannot be balanced if (len % 2 != 0) { return -1; } int left_brace = 0, right_brace = 0; int ans; for ( int i = 0; i < len; i++) { // If we find a left bracket then we simply // increment the left bracket if (expr[i] == '{' ) { left_brace++; } // Else if left bracket is 0 then we find // unbalanced right bracket and increment // right bracket or if the expression // is balanced then we decrement left else { if (left_brace == 0) { right_brace++; } else { left_brace--; } } } ans = ceil (left_brace / 2.0) + ceil (right_brace / 2.0); return ans; } // Driver program to test above function int main() { string expr = "}}{{" ; cout << countMinReversals(expr); return 0; } |
JAVA
// Java Code to count minimum reversal for // making an expression balanced. import java.util.*; public class GFG { // Method count minimum reversal for // making an expression balanced. // Returns -1 if expression cannot be balanced static int countMinReversals(String expr) { int len = expr.length(); int ans; // Expressions of odd lengths // cannot be balanced if (len % 2 != 0 ) { return - 1 ; } int left_brace = 0 , right_brace = 0 ; for ( int i = 0 ; i < len; i++) { char ch = expr.charAt(i); // If we find a left bracket then we simply // increment the left bracket if (ch == '{' ) { left_brace++; } // Else if left bracket is 0 then we find // unbalanced right bracket and increment // right bracket or if the expression // is balanced then we decrement left else { if (left_brace == 0 ) { right_brace++; } else { left_brace--; } } } ans = ( int )(Math.ceil(( 0.0 + left_brace) / 2 ) + Math.ceil(( 0.0 + right_brace) / 2 )); return ans; } // Driver method public static void main(String[] args) { String expr = "}}{{" ; System.out.println(countMinReversals(expr)); } } |
Python3
# Python 3 program to find minimum number of # reversals required to balance an expression import math # Returns count of minimum reversals for making # expr balanced. Returns -1 if expr cannot be # balanced. def countMinReversals(expr): length = len (expr) # Expressions of odd lengths # cannot be balanced if (length % 2 ! = 0 ): return - 1 left_brace = 0 right_brace = 0 for i in range (length): # If we find a left bracket then we simply # increment the left bracket if (expr[i] = = '{' ): left_brace + = 1 # Else if left bracket is 0 then we find # unbalanced right bracket and increment # right bracket or if the expression # is balanced then we decrement left else : if (left_brace = = 0 ): right_brace + = 1 else : left_brace - = 1 ans = math.ceil(left_brace / 2 ) + math.ceil(right_brace / 2 ) return ans # Driver program to test above function if __name__ = = "__main__" : expr = "}}{{" print (countMinReversals(expr)) # This code is contributed by ukasp. |
C#
// C# Code to count minimum reversal for // making an expression balanced. using System; public class GFG { // Method count minimum reversal for // making an expression balanced. // Returns -1 if expression cannot be balanced static int countMinReversals(String expr) { int len = expr.Length; int ans; // Expressions of odd lengths // cannot be balanced if (len % 2 != 0) { return -1; } int left_brace = 0, right_brace = 0; for ( int i = 0; i < len; i++) { char ch = expr[i]; // If we find a left bracket then we simply // increment the left bracket if (ch == '{' ) { left_brace++; } // Else if left bracket is 0 then we find // unbalanced right bracket and increment // right bracket or if the expression // is balanced then we decrement left else { if (left_brace == 0) { right_brace++; } else { left_brace--; } } } ans = ( int )(Math.Ceiling((0.0 + left_brace) / 2) + Math.Ceiling((0.0 + right_brace) / 2)); return ans; } // Driver method public static void Main(String[] args) { String expr = "}}{{" ; Console.WriteLine(countMinReversals(expr)); } } // This code is contributed by aashish1995. |
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) { let len = expr.length; // Expressions of odd lengths // cannot be balanced if (len % 2 != 0) { return -1; } let left_brace = 0, right_brace = 0; let ans; for (let i = 0; i < len; i++) { // If we find a left bracket then we simply // increment the left bracket if (expr[i] == '{' ) { left_brace++; } // Else if left bracket is 0 then we find // unbalanced right bracket and increment // right bracket or if the expression // is balanced then we decrement left else { if (left_brace == 0) { right_brace++; } else { left_brace--; } } } ans = Math.ceil(left_brace / 2) + Math.ceil(right_brace / 2); return ans; } // Driver program to test above function let expr = "}}{{" ; document.write(countMinReversals(expr)); </script> |
2
时间复杂性 :O(n)
辅助空间 :O(1)
我们不需要为左大括号和右大括号维护两个不同的变量,而是可以使用一个临时变量。
遍历数组。对于每个“{”,将temp的值增加1,对于每个“}”,如果temp的值大于0,则将temp的值减少1,否则,将result的值以及temp的值增加1。最后,将temp值的一半添加到结果中。
下面是C++中上述方法的实现。
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 s) { int temp=0, res=0, n=s.size(); if (n%2!=0) return -1; for ( int i=0;i<n;i++){ if (s[i]== '{' ) temp++; else { if (temp==0){ res++; temp++; } else temp--; } } if (temp>0) res += temp/2; return res; } // Driver program to test above function int main() { string expr = "}}{{" ; cout << countMinReversals(expr); return 0; //This code is contributed by Akansha Mittal } |
JAVA
// Java program to find minimum number of // reversals required to balance an expression import java.util.*; class GFG { // Returns count of minimum reversals for making // expr balanced. Returns -1 if expr cannot be // balanced. static int countMinReversals(String s) { int temp = 0 , res = 0 , n = s.length(); if (n % 2 != 0 ) return - 1 ; for ( int i = 0 ; i < n; i++) { if (s.charAt(i) == '{' ) temp++; else { if (temp == 0 ) { res++; temp++; } else temp--; } } if (temp > 0 ) res += temp / 2 ; return res; } // Driver program to test above function public static void main(String[] args) { String expr = "}}{{" ; System.out.print(countMinReversals(expr)); } } // This code is contributed by Rajput-Ji |
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 s) { int temp = 0, res = 0, n = s.Length; if (n % 2 != 0) return -1; for ( int i = 0; i < n; i++) { if (s[i] == '{' ) temp++; else { if (temp == 0) { res++; temp++; } else temp--; } } if (temp > 0) res += temp / 2; return res; } // Driver program to test above function public static void Main() { string expr = "}}{{" ; Console.Write(countMinReversals(expr)); } } // This code is contribute by ukasp. |
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( s) { var temp = 0, res = 0, n = s.length; if (n % 2 != 0) return -1; for (i = 0; i < n; i++) { if (s.charAt(i) == '{' ) temp++; else { if (temp == 0) { res++; temp++; } else temp--; } } if (temp > 0) res += temp / 2; return res; } // Driver program to test above function var expr = "}}{{" ; document.write(countMinReversals(expr)); // This code is contributed by Rajput-Ji </script> |
2
时间复杂性: O(n)
辅助空间: O(1)
感谢乌特卡什·特里维迪提出上述方法。 如果您发现任何不正确的地方,或者您想分享有关上述主题的更多信息,请写下评论。