题目:
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:
[ "((()))", "(()())", "(())()", "()(())", "()()()" ]
思路:
由于涉及到返回一个集合,所以可以很自然地想到回溯法。通过观察发现,所谓合法的括弧对字符串,就是它包含相等的左右括弧,并且在其任何一个前缀子串中,左括弧的个数都大于等于右括弧的个数。根据这一观察,可以分别设定深搜+回溯中返回、递归的条件。具体见代码。
代码:
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string> ret;
if(n == 0)
return ret;
string line;
generateParenthesis(ret, line, 0, 0, n);
return ret;
}
private:
void generateParenthesis(vector<string>& ret, string& line, int left, int right, int n)
{
if(left > n)
return;
if(left == n && right == n)
{
ret.push_back(line);
return;
}
if(left == right) // we can only add '('
{
line += '(';
generateParenthesis(ret, line, left + 1, right, n);
line.pop_back();
}
else if(left > right) // we can add both '(' and ')'
{
line += '(';
generateParenthesis(ret, line, left + 1, right, n);
line.pop_back();
line += ')';
generateParenthesis(ret, line, left, right + 1, n);
line.pop_back();
}
}
};