Question

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

For example, given n = 3, a solution set is:

[ "((()))", "(()())", "(())()", "()(())", "()()()" ]

solution

// Runtime: 16 ms, faster than 49.46% of C++ online submissions for Generate Parentheses.
// Memory Usage: 17.4 MB, less than 100.00% of C++ online submissions for Generate Parentheses.
class Solution {
 public:
  vector<string> generateParenthesis(int n) {
    vector<string> ans;
    generateParenthesisDFS(n, n, "", ans);
    return ans;
  }

 private:
  void generateParenthesisDFS(int left_n, int right_n, string out, vector<string>& ans) {
    if (left_n > right_n) return;
    if (left_n == 0 && right_n == 0) {
      ans.emplace_back(out);
    } else {
      if (left_n > 0) generateParenthesisDFS(left_n - 1, right_n, out + "(", ans);
      if (right_n > 0) generateParenthesisDFS(left_n, right_n - 1, out + ")", ans);
    }
  }
};

在 DFS 的函数中, 我们尽量不要使用太多的局部变量, 这样会造成栈的使用空间较多。 对上面的代码, 优化如下:

// Runtime: 12 ms, faster than 92.06% of C++ online submissions for Generate Parentheses.
// Memory Usage: 14 MB, less than 100.00% of C++ online submissions for Generate Parentheses.
class Solution {
 public:
  vector<string> generateParenthesis(int n) {
    vector<string> ans;
    string out;
    generateParenthesisDFS(n, n, out, ans);
    return ans;
  }

 private:
  void generateParenthesisDFS(int left_n, int right_n, string& out, vector<string>& ans) {
    if (left_n + right_n == 0) {
      ans.emplace_back(out);
      return;
    }
    if (left_n > right_n) return;

    if (left_n > 0) {
      generateParenthesisDFS(left_n - 1, right_n, out += "(", ans);
      out.pop_back();
    }
    if (right_n > 0) {
      generateParenthesisDFS(left_n, right_n - 1, out += ")", ans);
      out.pop_back();
    }
  }
};
By guozetang            Updated: 2020-09-19 13:02:30

results matching ""

    No results matching ""