题目描述
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:
[
"((()))",
"(()())",
"(())()",
"()(())",
"()()()"
]
解题思路
以下提供两种解题思路
- 直接使用回溯法遍历所有情况,然后在子节点处使用一个栈来判断括号是否完全对应。这是比较容易想到的,但是相当耗时,实测33ms
- 直观的解法。分别使用n和m来记录还需要加上多少个”(“和”)”。递归向下求解,当n>0时,添加”(“并给n-1以及m+1, 当m>0时,添加”)”并给m-1。当n和m都为0时,则为符合条件的情况。
AC代码
- 解法一(33ms)
class Solution {
public:
void genPar(vector<string>& ans, string& curStr, int n) {
if (curStr.size() == n) {
stack<char> tempS;
for (int i = 0; i < n; ++i) {
if (tempS.empty())
tempS.push(curStr[i]);
else {
char topChar = tempS.top();
if (topChar == '(' && curStr[i] == ')')
tempS.pop();
else
tempS.push(curStr[i]);
}
}
if (tempS.empty())
ans.push_back(curStr);
}
else {
curStr.push_back('(');
genPar(ans, curStr, n);
curStr.pop_back();
curStr.push_back(')');
genPar(ans, curStr, n);
curStr.pop_back();
}
}
vector<string> generateParenthesis(int n) {
string tempStr = "";
vector<string> ans;
genPar(ans, tempStr, 2*n);
return ans;
}
};
- 解法二(3ms)
class Solution {
public:
vector<string> generateParenthesis(int n) {
vector<string> res;
addingpar(res, "", n, 0);
return res;
}
void addingpar(vector<string> &v, string str, int n, int m){
if(n==0 && m==0) {
v.push_back(str);
return;
}
if(m > 0){ addingpar(v, str+")", n, m-1); }
if(n > 0){ addingpar(v, str+"(", n-1, m+1); }
}
};