logo

Пронађите да ли израз има дупле заграде или не

Дати уравнотежен израз пронађите да ли садржи дупле заграде или не. Скуп заграда је дупликат ако је исти подизраз окружен вишеструким заградама. 

Примери:  



    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, тада се проналази пар дуплих заграда у супротном нема појаве сувишних парова заграда. На пример (((а+б))+ц) има дупле заграде око 'а+б'. Када се наиђе на други ')' после а+б, стек садржи '(('. Пошто је врх стека почетна заграда, може се закључити да постоји су дупле заграде.

Испод је имплементација горње идеје: 



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 

Излаз
Duplicate Found 

Излаз:  

Duplicate Found

Временска сложеност горњег решења је О(н). 

Помоћни простор који програм користи је О(н).