


Given valid mathematical expressions in the form of a string. You are supposed to return true if the given expression contains a pair of redundant brackets, else return false. The given string only contains ‘(‘, ’)’, ‘+’, ‘-’, ‘*’, ‘/’ and lowercase English letters.
Note :A pair of brackets is said to be redundant when a subexpression is surrounded by needless/ useless brackets.
For Example :((a+b)) has a pair of redundant brackets. The pair of brackets on the first and last index is needless.
While (a + (b*c)) does not have any pair of redundant brackets.
The first line contains a single integer ‘T’ denoting the number of test cases. The test cases follow.
The first line of each test case contains a string denoting the expression.
Output Format :
For each test case, return “Yes” if the given expression contains at least one pair of redundant brackets, else return “No”.
Note :
You don’t need to print anything; It has already been taken care of. Just implement the given function.
1 <= T <= 50
3 <= |S| <= 10^4
Time Limit: 1 sec
2
(a+b)
(a+c*b)+(c))
No
Yes
In the first test case, there are no redundant brackets. Hence, the output is “No”.
In the second test case, the brackets around the alphabet ‘c’( index 8 and index 10) are redundant. Hence the output is “Yes”.
2
(a*b+(c/d))
((a/b))
No
Yes
In the first test case, there are no redundant brackets. Hence, the output is “No”.
In the second test case, the brackets around the subexpression “(a+b)” ( index 0 and index 6) are redundant. Hence the output is “Yes”.
Can you think about using a stack to find redundant brackets?
The idea is to use the stack to keep track of the opening and closing brackets. If we remove any subexpression from the given string which is enclosed by “()” and after that, if there exist any pair of opening and closing brackets“()” which does not have any operator(‘+’,’-’,’*’,’/’) in between them, then the expression will have a redundant pair of brackets.
The steps are as follows :
O(|S|), where |S| is the length of the given string.
We are iterating through the given string which will take O(|S|) time. Also, we are performing push and pop operations on a stack which take constant time. Thus, the total time complexity is O(|S|).
O(|S|), where |S| is the length of the given string.
We are using a stack for keeping track of brackets, in the worst case when there are no brackets and all the characters in the string are either operators or operands the size of the stack will become |S|. Thus, the overall space complexity will be O(|S|).