Scopri se un'espressione ha parentesi duplicate o meno
Data un'espressione bilanciata, verifica se contiene parentesi duplicate o meno. Una serie di parentesi è duplicata se la stessa sottoespressione è racchiusa tra più parentesi.
Esempi:
Below expressions have duplicate parenthesis -
((a+b)+((c+d)))
The subexpression 'c+d' is surrounded by two
pairs of brackets.
(((a+(b)))+(c+d))
The subexpression 'a+(b)' is surrounded by two
pairs of brackets.
(((a+(b))+c+d))
The whole expression is surrounded by two
pairs of brackets.
((a+(b))+(c+d))
(b) and ((a+(b)) is surrounded by two
pairs of brackets but it will not be counted as duplicate.
Below expressions don't have any duplicate parenthesis -
((a+b)+(c+d))
No subexpression is surrounded by duplicate
brackets.Si può presumere che l'espressione data sia valida e che non siano presenti spazi bianchi.
L'idea è di usare lo stack. Scorrere l'espressione data e per ciascun carattere nell'espressione se il carattere è una parentesi aperta '(' o uno qualsiasi degli operatori o operandi lo spinge in cima allo stack. Se il carattere è una parentesi chiusa ')', estrarre i caratteri dallo stack finché non viene trovata la parentesi aperta '(' corrispondente e viene utilizzato un contatore il cui valore viene incrementato per ogni carattere incontrato finché non viene trovata la parentesi di apertura '('. Se il numero di caratteri incontrati tra l'apertura e la chiusura coppia di parentesi che è uguale al valore del contatore è inferiore a 1, viene trovata una coppia di parentesi duplicate altrimenti non sono presenti coppie di parentesi ridondanti. Ad esempio (((a+b))+c) ha parentesi doppie attorno a "a+b". Quando viene incontrato il secondo ')' dopo a+b, lo stack contiene '(('. Poiché la parte superiore dello stack è una parentesi aperta, si può concludere che ci sono parentesi duplicate.
Di seguito è riportata l'implementazione dell'idea di cui sopra:
C++Java// C++ program to find duplicate parenthesis in a // balanced expression #includeusing namespace std ; // Function to find duplicate parenthesis in a // balanced expression bool findDuplicateparenthesis ( string str ) { // create a stack of characters stack < char > Stack ; // Iterate through the given expression for ( char ch : str ) { // if current character is close parenthesis ')' if ( ch == ')' ) { // pop character from the stack char top = Stack . top (); Stack . pop (); // stores the number of characters between a // closing and opening parenthesis // if this count is less than or equal to 1 // then the brackets are redundant else not int elementsInside = 0 ; while ( top != '(' ) { elementsInside ++ ; top = Stack . top (); Stack . pop (); } if ( elementsInside < 1 ) { return 1 ; } } // push open parenthesis '(' operators and // operands to stack else Stack . push ( ch ); } // No duplicates found return false ; } // Driver code int main () { // input balanced expression string str = '(((a+(b))+(c+d)))' ; if ( findDuplicateparenthesis ( str )) cout < < 'Duplicate Found ' ; else cout < < 'No Duplicates Found ' ; return 0 ; } Pythonimport java.util.Stack ; // Java program to find duplicate parenthesis in a // balanced expression public class GFG { // Function to find duplicate parenthesis in a // balanced expression static boolean findDuplicateparenthesis ( String s ) { // create a stack of characters Stack < Character > Stack = new Stack <> (); // Iterate through the given expression char [] str = s . toCharArray (); for ( char ch : str ) { // if current character is close parenthesis ')' if ( ch == ')' ) { // pop character from the stack char top = Stack . peek (); Stack . pop (); // stores the number of characters between a // closing and opening parenthesis // if this count is less than or equal to 1 // then the brackets are redundant else not int elementsInside = 0 ; while ( top != '(' ) { elementsInside ++ ; top = Stack . peek (); Stack . pop (); } if ( elementsInside < 1 ) { return true ; } } // push open parenthesis '(' operators and // operands to stack else { Stack . push ( ch ); } } // No duplicates found return false ; } // Driver code public static void main ( String [] args ) { // input balanced expression String str = '(((a+(b))+(c+d)))' ; if ( findDuplicateparenthesis ( str )) { System . out . println ( 'Duplicate Found ' ); } else { System . out . println ( 'No Duplicates Found ' ); } } }C## Python3 program to find duplicate # parenthesis in a balanced expression # Function to find duplicate parenthesis # in a balanced expression def findDuplicateparenthesis ( string ): # create a stack of characters Stack = [] # Iterate through the given expression for ch in string : # if current character is # close parenthesis ')' if ch == ')' : # pop character from the stack top = Stack . pop () # stores the number of characters between # a closing and opening parenthesis # if this count is less than or equal to 1 # then the brackets are redundant else not elementsInside = 0 while top != '(' : elementsInside += 1 top = Stack . pop () if elementsInside < 1 : return True # push open parenthesis '(' operators # and operands to stack else : Stack . append ( ch ) # No duplicates found return False # Driver Code if __name__ == '__main__' : # input balanced expression string = '(((a+(b))+(c+d)))' if findDuplicateparenthesis ( string ) == True : print ( 'Duplicate Found' ) else : print ( 'No Duplicates Found' ) # This code is contributed by Rituraj JainJavaScript// C# program to find duplicate parenthesis // in a balanced expression using System ; using System.Collections.Generic ; class GFG { // Function to find duplicate parenthesis // in a balanced expression static Boolean findDuplicateparenthesis ( String s ) { // create a stack of characters Stack < char > Stack = new Stack < char > (); // Iterate through the given expression char [] str = s . ToCharArray (); foreach ( char ch in str ) { // if current character is // close parenthesis ')' if ( ch == ')' ) { // pop character from the stack char top = Stack . Peek (); Stack . Pop (); // stores the number of characters between // a closing and opening parenthesis // if this count is less than or equal to 1 // then the brackets are redundant else not int elementsInside = 0 ; while ( top != '(' ) { elementsInside ++ ; top = Stack . Peek (); Stack . Pop (); } if ( elementsInside < 1 ) { return true ; } } // push open parenthesis '(' // operators and operands to stack else { Stack . Push ( ch ); } } // No duplicates found return false ; } // Driver code public static void Main ( String [] args ) { // input balanced expression String str = '(((a+(b))+(c+d)))' ; if ( findDuplicateparenthesis ( str )) { Console . WriteLine ( 'Duplicate Found ' ); } else { Console . WriteLine ( 'No Duplicates Found ' ); } } } // This code is contributed by 29AjayKumar// JavaScript program to find duplicate parentheses in a balanced expression function findDuplicateParenthesis ( s ) { let stack = []; // Iterate through the given expression for ( let ch of s ) { // If current character is a closing parenthesis ')' if ( ch === ')' ) { let top = stack . pop (); // Count the number of elements // inside the parentheses let elementsInside = 0 ; while ( top !== '(' ) { elementsInside ++ ; top = stack . pop (); } // If there's nothing or only one element // inside it's redundant if ( elementsInside < 1 ) { return true ; } } // Push open parenthesis '(' operators and operands to stack else { stack . push ( ch ); } } // No duplicates found return false ; } // Driver code let str = '(((a+(b))+(c+d)))' ; if ( findDuplicateParenthesis ( str )) { console . log ( 'Duplicate Found' ); } else { console . log ( 'No Duplicates Found' ); } // This code is contributed by rag2127
ProduzioneDuplicate FoundProduzione:
Duplicate FoundComplessità temporale della soluzione di cui sopra è O(n).
Spazio ausiliario utilizzato dal programma è O(n).