题目
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. 题目要求
给出一个整数n,生成n对括号组成的合法排列。当然n肯定得是非负整数,当n为0时,排列为空,即[ ]。
例如,当n为3的时候,其合法排列如下:
[ "((()))" , "(()())" , "(())()" , "()(())" , "()()()" ]。
2. 求解方法
对于一个n对括号组成的排列,当且仅当对于任意一个前缀子串,其左括号的个数大于等于右括号的个数。
因此,我们可以利用该条件来求解出合法的排列。
既然对于任意一个前缀子串,其左括号的个数大于等于右括号的个数,那么对于剩下的部分,左括号的个数应该小于等于右括号的个数。当剩下的左括号个数小于右括号个数时可以添加左括号或者右括号,否则,只能添加左括号。当剩下的左括号个数和剩下的右括号个数都为0时,说明找到一个合法排列。
我们可以利用深度优先的方法求解出所有的合法排列。
3. 代码如下
class Solution {
public:
vector<string> generateParenthesis(int n) {
string str = "";
if (n == 0) return vec;
generate(n, n, str);
return vec;
}
void generate(int left, int right, string str) {
if (left == 0 && right == 0) {
vec.push_back(str);
return;
}
if (left > 0) {
generate(left - 1, right, str + '(');
}
if (left < right && right > 0) {
generate(left, right - 1, str + ')');
}
}
vector<string> vec;
};