logo

Zistite, či má výraz duplicitné zátvorky alebo nie

Pri vyváženom výraze zistite, či obsahuje duplicitné zátvorky alebo nie. Sada zátvoriek je duplicitná, ak je rovnaký podvýraz obklopený viacerými zátvorkami. 

Príklady:  



    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.

Dá sa predpokladať, že daný výraz je platný a nie sú prítomné žiadne biele miesta. 

Cieľom je použiť zásobník. Iterujte daný výraz a pre každý znak vo výraze, ak je znakom otvorená zátvorka '(' alebo ktorýkoľvek z operátorov či operandov ho posunie na začiatok zásobníka. Ak je znak v tesných zátvorkách ')', potom vyberte znaky zo zásobníka, kým sa nenájde zodpovedajúca otvorená zátvorka '(', a použije sa počítadlo, ktorého hodnota sa zvýši pre každý nájdený znak ', kým sa nenarazí na číslo otvorenia pary. pár zátvoriek, ktorý sa rovná hodnote počítadla je menší ako 1, potom sa nájde pár duplicitných zátvoriek, inak sa nevyskytujú nadbytočné páry zátvoriek. Napríklad ((a+b))+c) má duplicitné zátvorky okolo „a+b“. Keď narazíte na druhé ')' po a+b, zásobník obsahuje '(('. Keďže horná časť zásobníka je otváracia zátvorka, možno usúdiť, že existujú duplicitné zátvorky.

Nižšie je uvedená implementácia vyššie uvedenej myšlienky: 



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 

Výstup
Duplicate Found 

výstup:  

ako odstrániť stĺpec v postgresql
Duplicate Found

Časová zložitosť vyššie uvedeného roztoku je O(n). 

Pomocný priestor používaný programom je O(n).