您的位置:首页 > 其它

LeetCode 22: Generate Parentheses

2015-10-21 17:12 351 查看

Generate Parentheses

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],但是现在不是求个数,而是要将所有合法的括号排列打印出来。

对一个长度为2n 的合法排列,第1到2n的位置都满足如下规则:左括号的个数大于等于右括号的个数。因此们可以按照这个规则去打印括号:假设在位置 k 我们还剩余 LP 个左括号和 RP 个右括号,如果LP > 0,则我们可以直接打印左括号;能否打印右括号,我们还必须验证 LP 和 RP 的值是否满足规则,如果LP < RP,则我们可以打印右括号,否则不可以打印右括号。如果 LP 和 RP 均为零,则说明我们已经完成一个合法排列,可以将其打印出来。通过DFS,我们可以很快地解决问题。

代码如下:

class Solution {
private:
void generate(int LP,int RP,string s,vector<string> &result) {
if(LP == 0 && RP == 0) {
//  LP 和 RP 均为零,则说明我们已经完成一个合法排列
result.push_back(s);
}

if(LP > 0) {
// LP > 0,可以打印左括号
generate(LP - 1, RP, s + '(', result);
}

if(RP > 0 && LP < RP) {
// LP < RP,可以打印右括号
generate(LP, RP - 1, s + ')', result);
}
}

public:
vector<string> generateParenthesis(int n) {
vector<string> result;
generate(n, n, "", result);
return result;
}
};


思路二

class Solution {
public:
vector<string> generateParenthesis (int n) {
if (n == 0) return vector<string>(1, "");
if (n == 1) return vector<string> (1, "()");

vector<string> result;
for (int i = 0; i < n; ++i)
for (auto inner : generateParenthesis (i))
for (auto outer : generateParenthesis (n - 1 - i))
result.push_back ("(" + inner + ")" + outer);

return result;
}
};
请参考百度百科中卡特兰数词条
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode