Editorial Parentheses Generation
Abdul Mateen
Assistant Professor | Computer Science | Programming Teacher | Competitive Programming Coach
Problem Statement: Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.
Example 1:
Input: n = 3
Output: ["((()))","(()())","(())()","()(())","()()()"]
Example 2:
Input: n = 1
Output: ["()"]
One of my students recently raised this question during our class session. While solving this recursively isn't overly challenging, it was particularly relevant as it fell under the topic of stacks. The intention behind this was to guide students towards understanding how to transition from a recursive solution to an iterative one, especially given the potential issues with recursion overhead, which can lead to stack overflow.
Considering the constraints we face, especially during the holy month of Ramadan where lecture duration are shorter, I encouraged the student to share the relevant link for further discussion. However, since the link hasn't been sent yet, I took it upon myself to search for the problem online. Thankfully, I was able to find it, and I'm pleased to report that I've successfully solved it using a stack-based approach.
The problem-solving process not only addressed the specific challenge posed but also served as an opportunity for students to grasp the significance of employing stack-based solutions in scenarios where recursion might not be the most efficient choice.
For my solution, I used three stacks, but students can simplify it by using a structure containing a triplet of strings, left and right counts, and managing it with just one stack. Here's the basic idea:
领英推荐
Start with an empty string, left count, and right count set to zero. Push this triplet onto the stack. While the stack is not empty, loop through the following steps: Begin by adding left parentheses to the string and incrementing the left count. Once the left count equals N, start adding right parentheses to the string until the right count is less than N. When the right count equals N, add the resulting string (a complete combination of parentheses) to the result. Check the top of the stack: If the left and right counts are equal, discard the triplet as it represents a combination already handled. If the stack is empty, break the loop and return the result.
Otherwise, pop the triplet from the stack, add a right parenthesis to the string, and increment the right count. Then add a left parenthesis and increment the left count. By implementing this approach, students can effectively manage the combinations of well-formed parentheses using just one stack, simplifying the solution while ensuring efficient handling of the problem. Top of Form
While the stack is not empty, we continue adding left parentheses until the left count is less than N. When the left count equals N, we start adding right parentheses and increment the right count. For example, when N equals 3:
N = 3
The triplet has empty string, left count and right count 0. The stack has ("", 0, 0). We have the following table:
We have already added "((()))", "(()())", "(())()" to the resultant vector. Next, we will add "()(())" and finally, "()()()". After that, the stack will become empty. I have given a detailed explanation, but I encourage students to stop reading here and attempt the problem on their own. If they are still struggling, here is the algorithm:
Initialize left, right with zero and string with empty.
Push the triplet string, left, right into stack
while stack is not empty:
if left < N:
add 1 to left
add '(' into string
push the triplet
else
while right < N:
add 1 to right
add ')' into string
add string into vector
while stack is not empty and stack top equal to N or left = right:
pop stack
if stack is empty:
terminate the loop
assign stack top to left, right and string
pop the stack
add 1 to right
add ')' to string
push the triplet
This problem presented an interesting challenge, and while there may be alternative solutions, the essence of using a stack remains consistent. I believe the approach outlined here can serve as a valuable foundation for tackling similar problems. If you have any feedback or suggestions for improvement, feel free to share them directly via email at "[email protected]" or leave your comments here. Your input is crucial for enhancing the quality of my articles and editorials in the future.
Software Engineering Student | Passionate about AI & Web Development | Skilled in C++, Java and Web Technologies
11 个月I will be very thankful if you will point out the mistake.
Software Engineering Student | Passionate about AI & Web Development | Skilled in C++, Java and Web Technologies
11 个月struct Three { ? ? string br; ? ? int left; ? ? int right; ? ? Three() : br(""), left(0), right(0) {} }; class Solution { public: ? ? vector<string> generateParenthesis(int n) { ? ? ? ? vector<string> out; ? ? ? ? stack<Three> s; ? ? ? ? s.push(Three()); ? ? ? ? while (!s.empty()) { ? ? ? ? ? ? Three triplet = s.top(); ? ? ? ? ? ? s.pop(); ? ? ? ? ? ? if (triplet.left < n) { ? ? ? ? ? ? ? ? triplet.left += 1; ? ? ? ? ? ? ? ? triplet.br += '('; ? ? ? ? ? ? ? ? s.push(triplet); ? ? ? ? ? ? } else { ? ? ? ? ? ? ? ? while (triplet.right < n) { ? ? ? ? ? ? ? ? ? ? triplet.right += 1; ? ? ? ? ? ? ? ? ? ? triplet.br += ')'; ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? out.push_back(triplet.br); ? ? ? ? ? ? ? ? while (!s.empty() && (s.top().right == n || s.top().left == s.top().right)) { ? ? ? ? ? ? ? ? ? ? triplet = s.top(); ? ? ? ? ? ? ? ? ? ? s.pop(); ? ? ? ? ? ? ? ? } ? ? ? ? ? ? ? ? if (s.empty()) break; ? ? ? ? ? ? ? ? triplet = s.top(); ? ? ? ? ? ? ? ? s.pop(); ? ? ? ? ? ? ? ? triplet.right += 1; ? ? ? ? ? ? ? ? triplet.br += ')'; ? ? ? ? ? ? ? ? s.push(triplet); ? ? ? ? ? ? } ? ? ? ? } ? ? ? ? return out; ? ? } };
Software Engineering Student | Passionate about AI & Web Development | Skilled in C++, Java and Web Technologies
11 个月Sir the algorithm you have provided for this code is not working properly. Like for n = 3 it is just giving ["((()))"] but it should be ["((()))","(()())","(())()","()(())","()()()"]