Finden Sie heraus, ob ein Ausdruck doppelte Klammern enthält oder nicht

Finden Sie anhand eines ausgeglichenen Ausdrucks, ob er doppelte Klammern enthält oder nicht. Eine Reihe von Klammern ist doppelt, wenn derselbe Unterausdruck von mehreren Klammern umgeben ist. 

Beispiele:  

    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.

Es kann davon ausgegangen werden, dass der angegebene Ausdruck gültig ist und keine Leerzeichen vorhanden sind. 

Die Idee ist, Stack zu verwenden. Durchlaufen Sie den angegebenen Ausdruck und für jedes Zeichen im Ausdruck, wenn das Zeichen eine offene Klammer „(“ ist oder einer der Operatoren oder Operanden es an die Spitze des Stapels schiebt. Wenn das Zeichen eine geschlossene Klammer „)“ ist, werden Zeichen aus dem Stapel entfernt, bis eine passende offene Klammer „(“ gefunden wird, und ein Zähler wird verwendet, dessen Wert für jedes gefundene Zeichen erhöht wird, bis die öffnende Klammer „(“ gefunden wird. Wenn die Anzahl der Zeichen zwischen der öffnenden und Wenn das schließende Klammerpaar, das dem Wert des Zählers entspricht, kleiner als 1 ist, wird ein doppeltes Klammerpaar gefunden, andernfalls treten keine redundanten Klammerpaare auf. Zum Beispiel hat (((a+b))+c) doppelte Klammern um „a+b“. Wenn das zweite ')' nach a+b angetroffen wird, enthält der Stapel '(('. Da die Oberseite des Stapels eine öffnende Klammer ist, kann daraus geschlossen werden Es gibt doppelte Klammern.

Nachfolgend finden Sie die Umsetzung der obigen Idee: 

C++
   // C++ program to find duplicate parenthesis in a   // balanced expression   #include          using     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  ;   }   
Java
   import     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 '  );      }      }   }   
Python
   # 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 Jain   
C#
   // 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
   // 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   

Ausgabe
Duplicate Found  

Ausgabe:  

 Duplicate Found  

Zeitkomplexität der obigen Lösung ist O(n). 

Hilfsraum Der vom Programm verwendete Wert ist O(n).