22. Generate Parentheses

每日一题 2019 - 03 - 11


题目:

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:

1
2
3
4
5
6
7
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]

解法:

这个题让我们给定N对括号,找出所有符合括号配对条件的组合;

思路大概就是回溯:

  • 从给出的样例我们可以看出,左括号紧挨着出现的次序依次递减,那么我们可以先遍历左括号,每次令 N - 1,在往深层次遍历过程中逐步加入(
  • 在加入(的过程中要考虑加入),因为括号是成对出现的
  • 同时需要两个限制条件:
    • 1). 左括号数目未加入序列的数目要小于右括号
    • 2). 左右括号遗留数目都为0时候表示已经加入完毕

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string> res;
generateParenthesisDFS(n, n, "", res);
return res;
}
void generateParenthesisDFS(int left, int right, string out, vector<string> &res) {
if (left > right) return;
if (left == 0 && right == 0) res.push_back(out);
else {
if (left > 0) generateParenthesisDFS(left - 1, right, out + '(', res);
if (right > 0) generateParenthesisDFS(left, right - 1, out + ')', res);
}
}
};
0%
undefined