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> v;
addstr( v,"",n,0);
return v;
}
void addstr(vector<string>& v,string str,int n,int m)
{
if(n==0&&m==0)
{
v.push_back(str);
return;
}
if(n>0) addstr(v,str+"(",n-1,m+1);
if(m>0) addstr(v,str+")",n,m-1);
}
};
二刷的时候做出来了,要注意nleft<=nright,否则会出现“(()))(”的情况。
我的思路是先把( 放入,全部放入后,然后再把 ) 放入。弹回上好几层后,发现可以再放入),然后放入(。 反正顺序就是:
[“((()))”,”(()())”,”(())()”,”()(())”,”()()()”]
class Solution {
public:
vector<string> generateParenthesis(int n) {
if(n==0) return result;
backtrack(n,n,"");
return result;
}
void backtrack(int nleft,int nright,string temp)
{
if(nleft>0&&nleft<=nright)
{
backtrack(nleft-1,nright,temp+"(");
}
if(nright>0&&nleft<=nright)
{
backtrack(nleft,nright-1,temp+")");
}
if(nleft==0&&nright==0)
result.push_back(temp);
}
private:
vector<string> result;
};