Дізнайтеся, чи має вираз повторювані дужки чи ні
Дано збалансований вираз, знайдіть, чи містить він повторювані дужки чи ні. Набір дужок є дублікатом, якщо той самий підвираз оточено декількома дужками.
приклади:
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.Можна припустити, що наведений вираз дійсний і в ньому відсутні пробіли.
Ідея полягає у використанні стека. Перебирайте заданий вираз і для кожного символу у виразі, якщо символ є відкритою дужкою '(' або будь-яким із операторів чи операндів виштовхує його на вершину стека. Якщо символ є закритою дужкою ')', тоді витягуйте символи зі стека, доки не буде знайдено відповідну відкриту дужку '(', і використовується лічильник, значення якого збільшується для кожного зустрінутого символу, доки не буде знайдено відкриваючу дужку '('. Якщо число символів, що зустрічаються між відкриттям і закриттям пара круглих дужок, яка дорівнює значенню лічильника, менше 1, тоді знайдено пару повторюваних дужок, інакше немає надлишкових пар дужок. Наприклад, (((a+b))+c) має повторювані дужки навколо 'a+b'. Коли зустрічається другий ')' після a+b, стек містить '(('. Оскільки вершина стека є відкриваючою дужкою, можна зробити висновок, що є дублікати дужки.
Нижче наведено реалізацію вищезазначеної ідеї:
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
ВихідDuplicate FoundВихід:
Duplicate FoundЧасова складність вищезгаданого рішення дорівнює O(n).
Допоміжне приміщення використовується програмою – це O(n).