DEV Community

Cover image for Leetcode 22. Generate Parentheses
codingpineapple
codingpineapple

Posted on

Leetcode 22. Generate Parentheses

Description

Given n pairs of parentheses, write a function to generate all combinations of well-formed parentheses.

Example 1:

Input: n = 3
Output: ["((()))","(()())","(())()","()(())","()()()"]
Enter fullscreen mode Exit fullscreen mode

Example 2:

Input: n = 1
Output: ["()"]
Enter fullscreen mode Exit fullscreen mode

Solution:

  • This solution will use backtracking
  • Backtracking is a systematic way of iterating through all possible combinations
  • These types of problems follow a similar pattern
// function to return answer and adds the params to the 
// recursive backtracking function 
function setup(n) {
    // answer to return
    // recursive backtrack(answer, emptyCombination);
    // return answer;
};

function backtrack(ans, curentCombination) {
    // if (base case) {
    //   add curentCombination to answer
    //}

    // logic for recursive call to add items 
    // to curentCombination
}
Enter fullscreen mode Exit fullscreen mode
  • We will recursively construct valid combinations of parens and return them in an array
  • Recursive algorithms require a base case in order to break out of the recursive calls
  • Let's think about a possible base case
  • In this problem, all opening parens must have a corresponding closing parens (opening count ==== closing count). Therefore the total number of parens in a valid combination = opening params + closing params = n x 2
  • Since any valid combination cannot be more than n x 2 in length, let's use this check as our base case
  • Once we hit the base case, we know that the current combination is valid and can be added to our output array
    if (cur.length == max * 2) {
        ans.push(cur);
        return;
    }
Enter fullscreen mode Exit fullscreen mode
  • When adding to our combination we can either add an opening or closing paren and we must have n amount of each
  • For the combination to be valid we must add an opening paren first
  • Once we've added this paren in the current combination we will add more until we reach our max limit (n)
  • We can repeat this logic through recursive calls
    if (open < max)
        backtrack(ans, cur+"(", open+1, close, max)
Enter fullscreen mode Exit fullscreen mode
  • Once we have added the opening parens we must add the closing parens through similar recursive logic
    if (close < open)
        backtrack(ans, cur+")", open, close+1, max);
Enter fullscreen mode Exit fullscreen mode
  • We keep track of each type of paren in our current combination starting at 0 for each in our setup function
  • Our current combination will start as an empty string and will have parens added to it on each call
  • The setup function will look like this
 var generateParenthesis = function(n) {
    const ans = [];
    backtrack(ans, "", 0, 0, n);
    return ans;
};
Enter fullscreen mode Exit fullscreen mode

Full solution

 var generateParenthesis = function(n) {
    const ans = [];
    backtrack(ans, "", 0, 0, n);
    return ans;
};

function backtrack(ans, cur, open, close, max) {
    if (cur.length == max * 2) {
        ans.push(cur);
        return;
    }

    if (open < max)
        backtrack(ans, cur+"(", open+1, close, max);
    if (close < open)
        backtrack(ans, cur+")", open, close+1, max);
}

Enter fullscreen mode Exit fullscreen mode

Top comments (0)

Neon image

Next.js applications: Set up a Neon project in seconds

If you're starting a new project, Neon has got your databases covered. No credit cards. No trials. No getting in your way.

Get started →

👋 Kindness is contagious

Explore a trove of insights in this engaging article, celebrated within our welcoming DEV Community. Developers from every background are invited to join and enhance our shared wisdom.

A genuine "thank you" can truly uplift someone’s day. Feel free to express your gratitude in the comments below!

On DEV, our collective exchange of knowledge lightens the road ahead and strengthens our community bonds. Found something valuable here? A small thank you to the author can make a big difference.

Okay