Sprawdź, czy wyrażenie ma zduplikowany nawias, czy nie
Biorąc pod uwagę zrównoważone wyrażenie, sprawdź, czy zawiera ono zduplikowany nawias, czy nie. Zestaw nawiasów jest duplikowany, jeśli to samo podwyrażenie jest otoczone wieloma nawiasami.
Przykłady:
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.Można założyć, że podane wyrażenie jest poprawne i nie ma w nim żadnych białych znaków.
Pomysł polega na użyciu stosu. Wykonaj iterację po podanym wyrażeniu i dla każdego znaku w wyrażeniu, jeśli znak jest nawiasem otwartym '(' lub którykolwiek z operatorów lub operandów wypycha go na górę stosu. Jeśli znak jest nawiasem zamykającym ')', następnie usuwaj znaki ze stosu, aż zostanie znaleziony pasujący nawias otwarty '(' i zostanie użyty licznik, którego wartość jest zwiększana po każdym napotkanym znaku, aż do znalezienia nawiasu otwierającego '('. Jeśli liczba znaków napotkanych pomiędzy otwarciem i para nawiasów zamykających równa wartości licznika jest mniejsza niż 1, wówczas zostanie znaleziona para zduplikowanych nawiasów, w przeciwnym razie nie wystąpią zbędne pary nawiasów. Na przykład (((a+b))+c) ma zduplikowane nawiasy wokół „a+b”. Kiedy zostanie napotkane drugie „)” po a+b, stos zawiera „((”. Ponieważ wierzchołek stosu jest nawiasem otwierającym, można wyciągnąć wniosek że istnieją zduplikowane nawiasy.
Poniżej implementacja powyższego pomysłu:
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
WyjścieDuplicate FoundWyjście:
Duplicate FoundZłożoność czasowa powyższego rozwiązania to O(n).
Przestrzeń pomocnicza używany przez program to O(n).