题目
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:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
解答
这题用回溯的方法来做。。。
按如下规则往一个括号组成的字符串中添加左括号或右括号:如果左括号没用完,可以直接添加左括号,或者当右括号没用完且当前字符串中左括号的数量大于右括号的数量,那么可以添加右括号。添加左括号不会导致字符串中的括号不匹配,因为添加的左括号肯定能在之后通过添加右括号进行匹配,又因为已经匹配的左右括号可以直接忽略,那么当右括号没用完且当前字符串中左括号的数量大于右括号的数量时,忽略已经匹配的左右括号,剩下的全是左括号,所以此时添加右括号可以匹配,而当右括号没用完且当前字符串中左括号的数量不大于右括号的数量时,此时添加的右括号无法在当前字符串中找到一个左括号进行匹配,也无法和之后添加的左括号进行匹配。
下面是AC的代码:
class Solution {
public:
vector<string> ans;
void generator(string str, int left, int right){
if(left == 0 && right == 0){
ans.push_back(str);
return ;
}
if(left > 0){
generator(str + '(', left - 1, right);
}
if(right > 0 && left < right){
generator(str + ')', left, right - 1);
}
}
vector<string> generateParenthesis(int n) {
string str = "";
generator(str, n, n);
return ans;
}
};
103